成员函数对浮点数不起作用

时间:2013-04-01 15:37:47

标签: 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定律?为什么会导致上述行为?

1 个答案:

答案 0 :(得分:14)

Eq的{​​{1}}的法律不是违反的monad法律,而是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)

浮点类型违反了这些法则,因为NaNs(NaN =非数字)与自身不相等,

0/0 /= 0/0

任何涉及NaN的比较<<=,...都会返回False

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