我目前正在阅读 wikibooks 中的 Alternative/MonadPlus 类型类。它很好地描述了差异。然而,一个令人费解的部分是guard
我假设的函数用于“短路”计算。(我对吗?)
该函数guard
虽然在中定义,但Control.Monad
有一个Alternative
约束,如下所示(链接)。
guard :: (Alternative f) => Bool -> f ()
guard True = pure ()
guard False = empty
但是上面的文章提到只MonadPlus
需要执行左零和右零定律(因此更强的主张)。
mzero >>= f = mzero -- left zero
m >> mzero = mzero -- right zero
鉴于guard
函数的目的,不应该用MonadPlus
约束来定义它吗?guard
如果应该“短路”计算,我们是否不需要更强大的法律?我很好奇具体设计选择背后的原因。
ps:我不知道除了“短路”这个词之外,还有什么更好的方式来描述“取消前期计算”的行为?