【发布时间】:2011-03-26 21:43:29
【问题描述】:
来自a gentle introduction to Haskell,有以下单子定律。谁能直观地解释一下它们的意思?
return a >>= k = k a
m >>= return = m
xs >>= return . f = fmap f xs
m >>= (\x -> k x >>= h) = (m >>= k) >>= h
这是我尝试的解释:
我们希望返回函数包装
a,这样它的一元性质就变得微不足道了。当我们将它绑定到函数时,没有单子效果,它应该只是将a传递给函数。m的解包输出被传递给重新包装它的return。一元的性质保持不变。所以和原来的monad是一样的。解包后的值被传递给
f,然后重新打包。一元的性质保持不变。这是我们将普通函数转换为一元函数时所期望的行为。我对这条法律没有任何解释。这确实表明 monad 必须是“几乎是关联的”。
【问题讨论】:
-
我正在努力理解这些规律,但我觉得一个好的规律教程将通过反例来实现。