繁体   English   中英

如果应用就足够了,为什么序列需要monad?

[英]Why sequence requires monad if applicative would suffice?

序列的签名是

sequence :: Monad m => t (m a) -> m (t a)

但我们可以实现它

sequence = traverse id

要求m只是Applicative 如果monad是applicatives那么为什么在类型级别上有这个约束呢?

Haskell中有许多函数是等价但不同的,因为ApplicativeFunctor )并没有用作Monad的超类。 例如:

  • returnpure

  • ap vs. <*>

  • liftM vs. liftA vs. fmap

  • liftM2liftM3 ,&c。 liftA2liftA3 ,&c。

  • mapM / forMtraverse / for

  • mapM_ / forM_traverse_ / for_

  • sequencesequenceA

  • mzeromplus (来自MonadPlus )与empty &&( <|>来自Alternative

具有原始Monad签名的旧功能仍然存在,但在新代码中,自应用Monad Proposal(AMP)实施以来,您可以始终使用Applicative版本,因为它们稍微更通用 - 也就是说,您可以随时使用用pure代替return ,但反之则不然。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM