|
|
1
49
你的描述很好。一般来说,人们会说三个单子定律,分别是1,2和4。你的第三定律稍有不同,我稍后再谈。 对于三个单子定律,我发现用克莱斯利作曲更容易直观地理解它们的含义:
现在法律可以写成:
1) 左恒等式法则-返回值不会改变值,也不会在monad中执行任何操作。
两个身份法基本上说的是同一件事,但它们都是必要的,因为
现在是第三定律。这个定律本质上说,函子实例和你的单子实例在把一个函数提升到单子中时的行为是一样的,两个实例都不是单子。如果我没弄错的话,当一个单子遵守其他三条定律,函子实例遵守函子定律,那么这个陈述永远是正确的。 Haskell Wiki Typeclassopedia 也是一个很好的参考。 |
|
|
2
24
属性集。正如约翰所说,你提到的第三定律稍有不同,但下面是其他定律的分解方法: 绑定到单子的函数就像普通函数一样组成。
在很大程度上,你可以把额外的一元结构看作是一系列与一元值相关联的额外行为;例如
从这个意义上说,
这三条定律描述了一个可笑的共同模式,不幸的是,Haskell不能完全概括地表达出来。如果你有兴趣,
|
|
|
3
12
依据
这允许返回一元值的函数正常工作。 |
|
|
4
4
最后一条定律是bind的结合性。这意味着你采取了如下措施:
把它变成
有时单子并不完全遵循这些规律,特别是当出现某种底部值时。只要它被记录在案并且“道德上是正确的”(也就是说,非底线价值遵循法律,或者结果在其他方面被认为是等价的),那就可以了。 |