[英]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中有許多函數是等價但不同的,因為Applicative
( Functor
)並沒有用作Monad
的超類。 例如:
return
與pure
ap
vs. <*>
liftM
vs. liftA
vs. fmap
liftM2
, liftM3
,&c。 與liftA2
, liftA3
,&c。
mapM
/ forM
與traverse
/ for
mapM_
/ forM_
與traverse_
/ for_
sequence
與sequenceA
mzero
& mplus
(來自MonadPlus
)與empty
&&( <|>
來自Alternative
)
具有原始Monad
簽名的舊功能仍然存在,但在新代碼中,自應用Monad Proposal(AMP)實施以來,您可以始終使用Applicative
版本,因為它們稍微更通用 - 也就是說,您可以隨時使用用pure
代替return
,但反之則不然。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.