【发布时间】:2013-03-22 16:57:31
【问题描述】:
在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
作者指出这是因为 Eq 和 Ord 浮点实例不遵守单子定律。 Eq 和 Ord 浮点实例如何违反单子定律,为什么会导致上述行为?
【问题讨论】:
-
想想
Set数据类型如何存储元素(排序树)并考虑let x = 0 / 0 :: Float in compare 0 x == compare x 0 -- both are GT的事实。当您查看错误的分支时,很难找到元素。 -
鉴于允许 /0 会使算术完全崩溃,因此将它包含在代码中会导致错误也就不足为奇了。当你的数学老师说你不能除以零时,他们是认真的。 ;)
-
为了记录,作者实际上声明浮点数不遵守 Eq 和 Ord 的定律,而不是说它们不遵守单子定律。这是一个类比,为什么你不应该违反法律;你引入了错误。
标签: haskell floating-point monads