使用 Haskell 范围:为什么跨范围映射浮点函数会导致它返回额外的元素?

2023-11-21

我知道浮点数由于其不精确的性质可能会导致范围内的奇怪行为。 我预计可能存在不精确的值。例如:[0.1,0.3..1]可能会给[0.1,0.3,0.5,0.7,0.8999999999999999]代替[0.1,0.3,0.5,0.7,0.9]

然而,除了精度损失之外,我还得到了一个额外的元素:

ghci> [0.1,0.3..1]
[0.1,0.3,0.5,0.7,0.8999999999999999,1.0999999999999999]

这很奇怪,但解释了here。我想我可以这样解决它:

ghci> [0.1,0.3..0.99]
[0.1,0.3,0.5,0.7,0.8999999999999999]

但这有点恶心。也许有一种更清洁的方法。当然,对于这个简单的例子,我可以只使用范围[0.1,0.3..0.9]一切都很好。

但在更复杂的示例中,我可能不会很快知道(或者如果我很懒的话,想弄清楚)我应该使用的确切上限。那么,我只需制作一个整数范围,然后除以 10,对吧?没有:

ghci> map (/10) [1,3..10]
[0.1,0.3,0.5,0.7,0.9,1.1]

任何浮点函数似乎都会导致此行为:

ghci> map (*1.0) [1,3..10]
[1.0,3.0,5.0,7.0,9.0,11.0]

而非浮动函数则不会:

ghci> map (*1) [1,3..10]
[1,3,5,7,9]

虽然看起来不太可能,但我认为可能是一些懒惰的评估在起作用,并尝试首先强制评估范围:

ghci> let list = [1,3..10] in seq list (map (*1.0) list)
[1.0,3.0,5.0,7.0,9.0,11.0]

显然,使用文字列表而不是范围可以很好地工作:

ghci> map (*1.0) [1,3,5,7,9]
[1.0,3.0,5.0,7.0,9.0]

ghci> let list = [1,3,5,7,9] in seq list (map (*1.0) list)
[1.0,3.0,5.0,7.0,9.0]

它不仅仅是映射:

ghci> last [1,3..10]
9

ghci> 1.0 * (last [1,3..10])
11.0

将函数应用于某个范围的结果会如何影响该范围的实际评估结果?


我在写这篇文章时为自己回答了这个问题。

Haskell 使用类型推断,因此当它看到浮点函数被映射到列表上(或在该列表的元素上使用,如我使用最后一个的示例中所示)时,它将推断该列表的类型为浮点因此评估范围就好像它是[1,3..10] :: [Float]而不是我想要的,那就是[1,3..10] :: [Int]

此时,它使用 Float 规则进行枚举,如我在问题中链接到的帖子.

可以像这样强制预期的行为:

ghci> map (\x -> (fromIntegral x) / 10) ([1,3..10]::[Int])
[0.1,0.3,0.5,0.7,0.9]

依靠 Haskell 的类型推断,我们可以放弃::[Int]因为 fromIntegral 使我们的 lambda 表达式具有正确的类型:

ghci> :t (\x -> (fromIntegral x) / 10)
(\x -> (fromIntegral x) / 10)
  :: (Fractional a, Integral a1) => a1 -> a
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Haskell 范围:为什么跨范围映射浮点函数会导致它返回额外的元素? 的相关文章

  • 为什么 GeneralizedNewtypeDeriving 没有安全的 Haskell?

    来自 GHC 手册 第安全语言 http www haskell org ghc docs 7 6 2 html users guide safe haskell html safe language 模块边界控制 使用安全语言编译的 Ha
  • 副作用是纯函数中找不到的一切吗?

    可以肯定地说 以下二分法成立 每个给定的函数是 要么纯粹 或有副作用 如果是这样 函数的 副作用就是纯函数中找不到的任何东西 这很大程度上取决于您选择的定义 可以公平地说 函数是pure or impure 纯函数始终返回相同的结果并且不会
  • 如何向 Scotty 中间件添加基本身份验证?

    我目前正在制作 Scotty API 但找不到任何 basicAuth 实现的示例 Wai Middleware HttpAuth 具体来说 我想将基本身份验证标头 用户 通行证 添加到我的某些端点 即以 admin 开头的端点 我已经设置
  • 如何在 TH 拼接中复制 'name 的行为

    考虑这个 Haskell 文件 LANGUAGE TemplateHaskell OPTIONS GHC fplugin Test Inspection Plugin module Text main where import Test I
  • 如何、为什么以及何时使用“.Internal”模块模式?

    我在上面看到了几个包裹hackage http hackage haskell org packages archive pkg list html其中包含模块名称 Internal作为他们的姓氏组成部分 例如Data ByteString
  • 'lens' 的阴谋集团依赖性解析失败

    我刚刚做了一个阴谋更新并尝试从 hackage 安装 lens 这给了我以下错误 cabal install j lens Resolving dependencies Configuring dlist 0 7 0 1
  • 计算两点之间的距离(Haskell)

    给定两个元组的输入 我希望能够使用以下公式计算两点之间的距离 距离 sqrt x1 x2 2 y1 y2 2 所以我希望函数调用和输出如下所示 gt distance 5 10 3 5 5 385 当我尝试运行下面的代码时 它告诉我输入 w
  • 如何检查一个数字是否包含在一个范围内(在一个语句中)?

    我正在使用 Ruby on Rails 3 0 9 我想检查某个数字是否包含在某个范围内 也就是说 如果我有一个变量number 5我想检查一下1 lt number lt 10并检索一个布尔值 如果number值包含在该范围内 我可以这样
  • 列表理解:制作列表列表

    你好 我正在尝试在 haskell 中创建一个函数 该函数接受一个数字 a 使用列表 即数字 将其一部分4它会创造 1 1 1 1 1 1 2 1 3 2 2 4 我正在考虑使用列表理解来创建列表 x 然后使用 1 n 中的数字创建更多列表
  • 如何找到仅是 2、3 和 5 的幂的倍数的所有数字的列表? [复制]

    这个问题在这里已经有答案了 I am trying to generate a list of all multiples which can be represented by the form where a b and c are w
  • 处理许多不相关的类型时避免样板

    我正在编写处理以下值的代码语言 扩展 注释 语法 http hackage haskell org packages archive haskell src exts 1 1 4 doc html Language Haskell Exts
  • 在 haskell 中处理 IO 与纯代码

    我正在编写一个shell脚本 我在haskell中的第一个非示例 它应该列出一个目录 获取每个文件大小 进行一些字符串操作 纯代码 然后重命名一些文件 我不确定我做错了什么 所以有两个问题 我应该如何安排这样的程序中的代码 我有一个具体问题
  • 如何在 OpenCV 中将 Float Mat 写入文件

    我有一个矩阵 Mat B 480 640 CV 32FC1 包含浮点值 我想将此矩阵写入一个可以打开的文件Notepad https en wikipedia org wiki Windows Notepad or 微软Word https
  • for循环中的范围是什么类型?

    当我们写下以下内容时 for i in 1 10 do stuff 我想知道什么类型有范围1 10在函数调用中使用它 例如 myFunc 1 10 如果在定义后放置断点let range 1 lt 10 你会发现它实际上不是一个Range结
  • 将浮点数 1864.78 转换为二进制和 IEEE 格式

    我一直在尝试将 S P 500 的值 今天为 1864 78 转换为它在内存中以 IEEE 单精度格式表示的方式 转换小数点左边 1864 很容易 11101001000 但如何获得十进制 78 的二进制表示形式呢 我尝试使用该技术 但它会
  • 为什么 exceptT 没有 MonadMask 实例?

    爱德华 克梅特例外情况图书馆不提供单子掩码 https www stackage org haddock lts 7 18 exceptions 0 8 3 Control Monad Catch html t MonadMask实例为Ex
  • 什么是阴谋地狱?

    在阅读有关 阴谋地狱 的内容时 我有点困惑 因为这个词的含义太多了 我猜最初 Cabal Hell 指的是钻石依赖问题 该问题是通过限制构建计划在每个构建计划中只有任何包的单个版本来解决的 一个包的两个不同版本不能存在于单个构建计划中 正如
  • 如何避免编写这种类型的 Haskell 样板代码

    我经常遇到这种情况 这很烦人 假设我有一个 sum 类型 它可以保存一个实例x或一堆其他无关的事情x data Foo x X x Y Int Z String other constructors not involving x 要声明
  • 为什么 Go 中只有 int 而没有 float?

    在 Go 中 有这样的类型int这可能相当于int32 or int64取决于系统架构 我可以声明一个整数变量而不用担心它的大小 var x int 为什么没有这个类型float 这相当于float32 or float64取决于我的系统架
  • 为什么 Haskell 中的点是从右向左排列的?

    如果我们有两个函数 f and g 然后在哈斯克尔h f g相当于h x f g x IE 这些函数从右到左应用于输入 有什么根本原因可以解释为什么它是从右到左 而不是从左到右吗 IE 他们为什么不做h f g相当于h x g f x 反而

随机推荐

  • 将 feDropShadow 添加到 SVG 中的垂直线使其消失

    我有以下 SVG 文档
  • 以编程方式从 Exchange Outlook 联系人获取 Internet 电子邮件地址?

    我正在尝试从连接 Exchange 的 Outlook 读出 Internet 格式的地址 我从 Outlook 联系人中读取了所有联系人 即不是从全局通讯簿 GAB 中读取的 问题是对于存储在 Exchange GAB 中的联系人中的所有
  • jQuery:如何检测给定元素内的 html 是否已更改?

    在 javascript 中 可能使用 jQuery 如何检测给定元素的 html 内容是否已更改 我希望能够做类似的事情 myDiv change function do some stuff 我基本上试图检测给定元素是否被添加到 div
  • 如何通过“下拉并释放”手势刷新 UIWebView?

    我知道这在 iPhone 版 Tweetie 或 xkcd iPhone 应用程序中是可能的 但他们使用的是表格 知道这是否可以通过简单的方式完成UIWebView还有 我知道 Javascript 建议这个问题 但是本地制作怎么样 要检索
  • 在 mysql 中过滤别名

    为什么以下查询不起作用 Mysql 抱怨 z 我不能在 WHERE 子句中使用别名吗 SELECT x y AS z t FROM t WHERE x 1 and z 2 我得到的错误是 Error Code 1054 Unknown co
  • Ruby strftime '%Z' 方法返回 '0545' 而不是 'NPT'

    将我的 MacOS 升级到最新版本后 我在使用 Time strftime 方法时遇到一些奇怪的问题 Time now in time zone Kathmandu strftime Z gt 0545 Time now in time z
  • 增加IP地址

    在该程序中我想增加IP地址 我看到这样的输出 125 23 45 67 126 23 45 67 127 23 45 67 128 23 45 67 129 23 45 67 130 23 45 67 131 23 45 67 132 23
  • 连接字符串最有效的方法?

    连接字符串最有效的方法是什么 里科 马里亚尼 NET 性能大师一篇文章关于这个主题 这并不像人们想象的那么简单 基本建议是这样的 如果你的模式看起来像 x f1 f2 f3 f4 这是一个连接 而且速度很快 StringBuilder 可能
  • 组织编程竞赛 - Howto 编译和执行

    我正在构建一个基于 Web 的界面 人们可以在其中输入简单的 C 代码来解决算法编程问题 我正在使用 Ace 编辑器 人们可以在其中输入代码 当按下运行按钮时 C 代码将被发送到服务器 进行编译并发送回输出 如何以安全的方式完成第二部分 我
  • 如何使用 Java EE 7 WebSockets 实现向客户端推送?

    我浏览了很多 Web Socket 示例 演示幻灯片 它们大多集中在相当简单的场景上 其中客户端与服务器之间的通信由客户端发起 我对另一种场景感兴趣 它似乎同样实用 纯粹的服务器推送到客户端 我想到的示例是一个更新网站上股票价值的应用程序
  • 最广泛使用的 C++ 向量/矩阵数学/线性代数库是什么,以及它们的成本和收益权衡? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 似乎许多项目慢慢地需要进行矩阵数学 并陷入首先构建一些向量类并慢慢添加功能的陷阱 直到他们发现构建了一个半途而废的自定义线性代数库 并依赖它 我想避
  • 如何制作一个简单的PHP应用程序从heroku cedar堆栈发送电子邮件?

    我有一个非常简单的 php 网站 有一个使用 php mail 函数发送电子邮件的联系表单 我怎样才能在heroku上托管这个 我应该使用哪个附加组件 如何将其设置为与 php 一起使用 这是我为解决同样的问题所做的 1 您需要使用自定义构
  • 错误:在reduce函数上传递的不可变值

    我正在尝试执行以下代码 将元组数组转换为字典 但收到一条编译错误 String String 类型的不可变值仅具有名为 updateValue 的可变成员 var array key0 value0 key1 value1 var init
  • 如何使用多个 AVVideoComposition 合成视频

    我想弄清楚如何合成多个视频 AVAssets 成单个视频 以便每个视频都有自己的视频合成 但是 我看不到实现此目标的方法 并且想知道是否有人有任何想法 考虑以下 上图说明了我正在尝试做的事情 我想从四个不同的视频中获取视频轨道 并将它们合并
  • 删除临时表(如果存在)

    Friends 我正在创建一个临时表 该脚本可能会运行多次 因此我需要检查临时表是否存在然后删除它 我已经编写了下面的代码 但运行脚本两次时出现错误 该表已经存在 数据库中已有一个名为 lu sensor name 19 的对象 看起来IF
  • Android NDK 和 Google Play 过滤

    Google Play 应用商店会自动将您的应用程序过滤到具有兼容 CPU 架构的设备 例如 如果您有一个仅为 ARMv5 编译的库 您的应用程序将仅显示在具有 ARMv5 或 ARMv7 处理器的设备上 如果我有 Java 替代方案 并且
  • Switch 语句示例 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 如果此文本框的总计为 Po
  • ReactJs:是否可以通过类名将 DOM 渲染为文档?

    我正在学习 ReactJs 并且非常喜欢它 我想问一下我们是否可以通过类名将虚拟 DOM 渲染到文档中 React render
  • scanf Cppcheck警告

    Cppcheck 显示 scanf 的以下警告 Message scanf without field width limits can crash with huge input data To fix this error messag
  • 使用 Haskell 范围:为什么跨范围映射浮点函数会导致它返回额外的元素?

    我知道浮点数由于其不精确的性质可能会导致范围内的奇怪行为 我预计可能存在不精确的值 例如 0 1 0 3 1 可能会给 0 1 0 3 0 5 0 7 0 8999999999999999 代替 0 1 0 3 0 5 0 7 0 9 然而