haskell - 成员函数对于 float 无法正常工作

标签 haskell floating-point monads

this答案,以下代码的评估如下:

> let x = fromList  [0, -1, 0/0, -5, -6, -3] :: Set Float

> member 0 x
True

> let x' = insert (0/0) x

> member 0 x'
False

作者指出发生这种情况是因为 EqOrd 浮点实例不遵守 monad 定律。 EqOrd 浮点实例如何违反单子(monad)定律以及为什么会导致上述行为?

最佳答案

这不是违反了单子(monad)法则,而是 Eq 的法则。关于Ord .

关于 Eq 的法律要求(==)定义等价关系,

forall x. x == x
forall x y. x == y <=> y == x
forall x y z. x == y && y == z => x == z

以及Ord的合约是<定义总排序,

forall x. not (x < x)
forall x y. (x < y) || (x == y) || (y < x)
forall x y. not (x < y && y < x)

浮点类型违反了这些定律,因为 NaN(NaN = 非数字)与其自身比较不相等,

0/0 /= 0/0

以及任何比较< , <= , ... 涉及 NaN 返回 False .

因此,当应该排序的树中存在 NaN 时,在搜索元素时与 NaN 进行比较可能会将递归搜索发送到错误的子树。

关于haskell - 成员函数对于 float 无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15746479/

相关文章:

performance - 如何处理具有恒定内存的两条长线?

haskell - Haskell : abort writeFile on error

assembly - 浮点加法汇编算法

ios - 使用 NEON 进行 aabb 截锥体剔除

c++ - 为什么设置一个 const 变量(将以相同的值存储)在划分后会导致不同的结果?

Scala 尝试和奇怪的行为

haskell - StateT 和非确定性 monad : a simple example

haskell - 特定情况下的功能依赖

haskell - 如何拒绝使用特定的 ghc 版本进行构建

haskell - 不是仿函数/仿函数/应用/单子(monad)的好例子?