簡體   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