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

Wes*_*ser 6 floating-point monads haskell

回答中,以下代码的计算方法如下:

> 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
Run Code Online (Sandbox Code Playgroud)

笔者指出了这种情况,因为EqOrd浮点情况下,不服从法律的单子.如何EqOrd浮点实例打破monad定律,为什么会导致上述行为?

Dan*_*her 14

这并不是说是违反法律的单子,但法律Eq对于Ord.

定义等价关系的Eq需求法则(==),

forall x. x == x
forall x y. x == y <=> y == x
forall x y z. x == y && y == z => x == z
Run Code Online (Sandbox Code Playgroud)

合同Ord<定义总排序,

forall x. not (x < x)
forall x y. (x < y) || (x == y) || (y < x)
forall x y. not (x < y && y < x)
Run Code Online (Sandbox Code Playgroud)

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

0/0 /= 0/0
Run Code Online (Sandbox Code Playgroud)

和任何比较<,<=......涉及NaN的回报False.

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