gpt4 book ai didi

haskell - 为什么是 MonadPlus 而不是 Monad + Monoid?

转载 作者:行者123 更新时间:2023-12-03 07:50:49 26 4
gpt4 key购买 nike

我试图了解 MonadPlus 背后的动机.如果已经有类型类 Monad 为什么还需要它?和 Monoid ?

当然,Monoid 的实例是具体类型,而 Monad 的实例需要一个类型参数。 (见 Monoid vs MonadPlus 以获得有用的解释。)但是你不能重写任何类型约束

(MonadPlus m) => ...

作为 Monad 的组合和 Monoid ?
(Monad m, Monoid (m a)) => ...

采取 guard函数来自 Control.Monad , 例如。它的实现是:
guard :: (MonadPlus m) => Bool -> m ()
guard True = return ()
guard False = mzero

我只能使用 Monad 来实现它和 Monoid :
guard' :: (Monad m, Monoid (m ())) => Bool -> m ()
guard' True = return ()
guard' False = mempty

有人可以澄清 MonadPlus之间的真正区别吗?和 Monad + Monoid ?

最佳答案

But couldn't you rewrite any type constraint of

(MonadPlus m) => ...

as a combination of Monad and Monoid?


不。在您链接的问题的最佳答案中,已经对 MonadPlus 与 Monoid 的定律进行了很好的解释。但是,即使我们忽略类型类法则,也会存在差异。 Monoid (m a) => ...表示 m a必须是一个特定 a 的幺半群由调用者选择,但 MonadPlus m表示 m a必须是所有 a 的幺半群.所以 MonadPlus a更灵活,这种灵 active 在四种情况下很有帮助:
  • 如果我们不想告诉调用者什么 a我们打算使用。MonadPlus m => ...而不是 Monoid (m SecretType) => ...
  • 如果我们要使用多个不同的a .MonadPlus m => ...而不是 (Monoid (m Type1), Monoid (m Type2), ...) => ...
  • 如果我们想使用无限多不同的a .MonadPlus m => ...而不是不可能。
  • 如果我们不知道 a我们需要。MonadPlus m => ...而不是不可能。
  • 关于haskell - 为什么是 MonadPlus 而不是 Monad + Monoid?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23023961/

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