gpt4 book ai didi

haskell - 如果你违反了单子(monad)法则,你会发生什么?

转载 作者:行者123 更新时间:2023-12-02 15:48:08 24 4
gpt4 key购买 nike

编译器或库的更“ native ”部分(IO 或可以访问黑魔法和实现的函数)是否对这些定律做出假设?打破它们会导致不可能的事情发生吗?

或者它们只是表达了一种编程模式——也就是说,你唯一会因为破坏它们而惹恼的人是那些使用你的代码并且没想到你会如此粗心的人?

最佳答案

单子(monad)法则只是实例应遵循的附加规则,超出了类型系统中可以表达的规则。只要 Monad 表达了一种编程模式,法则就是该模式的一部分。这些法则也适用于其他类型类:MonoidMonad 具有非常相似的规则,并且通常预期 Eq 的实例将遵循除其他示异常(exception),平等关系预期的规则。

因为这些法则在某种意义上是类型类的“一部分”,所以其他代码应该合理地期望它们将保持并采取相应的行动。因此,行为不当的实例可能会违反客户端代码逻辑所做的假设,从而导致错误,而错误的责任正确地归咎于实例,而不是使用它的代码。

简而言之,“违反单子(monad)法则”通常应理解为“编写有缺陷的代码”。

<小时/>

我将用一个涉及另一个类型类的示例来说明这一点,该示例是根据 Daniel Fischer 在 haskell-cafe 邮件列表上给出的类型类进行修改的。众所周知,标准库包含一些行为不当的实例,即浮点类型的 EqOrd。正如您可能猜到的,当涉及 NaN 时,就会出现错误行为。考虑以下数据结构:

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

其中 0/0 产生 NaN,这违反了 Data.Set.SetOrd 实例所做的假设。此Set是否包含0

> member 0 x
True

是的,当然有,就在显而易见的地方!现在,我们将一个值插入到Set中:

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

这个Set仍然包含0,对吗?毕竟我们没有删除任何东西。

> member 0 x'
False

...。噢,亲爱的。

关于haskell - 如果你违反了单子(monad)法则,你会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6399648/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com