gpt4 book ai didi

haskell - 为什么 `guard` 没有用 MonadPlus 约束定义?

转载 作者:行者123 更新时间:2023-12-02 02:30:03 37 4
gpt4 key购买 nike

我目前正在阅读 wikibooks 中的 Alternative/MonadPlus 类型类。 .它很好地描述了差异。然而,一个令人费解的部分是 guard我假设的函数用于“短路”计算。 (我对吗?)

函数guard尽管在 Control.Monad 中定义有一个 Alternative约束,如下(link)。

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 我们不需要更强有力的法律吗?应该“短路”计算?我很好奇具体设计选择背后的原因。

p.s.:除了“短路”这个词之外,我不知道有什么更好的方式来描述“取消前期计算”行为?

最佳答案

guard有一个 Applicative约束,因为您不需要对其执行单子(monad)操作来定义函数。

它的定义是(从 Hackage source 复制):

guard           :: (Alternative f) => Bool -> f ()
guard True = pure ()
guard False = empty

如果它指定了 MonadPlus而不是 Alternative ,它不会有任何收获。 MonadPlusAlternative 的子类, 所以所有 MonadPlus实例可以使用 guard ,但不是全部 Alternatives可以使用它。

(虽然排除 Alternatives 的情况很少——提到的两种情况 here 都有 MonadPlus 的实例,即使它们不满足左分配规则。)

一般来说,最好坚持编写函数所需的最低限度的限制,即使预期用途更具体。这样一来,就没有什么不应该被排除在外了,也没有来自那些可以为它工作但不是单子(monad)的人的提示。

巧合的是, Hoogle search results错误地显示 MonadPlus而是限制,但如果您单击链接,则它是正确的。

关于haskell - 为什么 `guard` 没有用 MonadPlus 约束定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42037064/

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