之前,它曾经有map
和sequence
以下实施:
mapM :: Monad m => (a -> m b) -> [a] -> m [b]
sequence :: Monad m => [m a] -> m [a]
然后haskell贡献者确实推广到:
traverse :: Applicative f => (a -> f b) -> t a -> f (t b)
sequenceA :: (Applicative f, Traversable t) => t (f a) -> f (t a)
为什么他们选择应用于monad?
他们如何成为概括mapM
和sequence
的想法?我想了解这个过程,当我必须更抽象时。如您所见,函数mapM
和sequence
仅适用于列表,但traverse
和sequenceA
更抽象,适用于已实现Traversable
的所有数据类型。
答案 0 :(得分:2)
选择申请是因为我们想要连锁行动但行动顺序不依赖于以前的结果。
Monad:action1 >>= \resultOfAction1 -> if P(resultOfAction1) then action1 else action2
(行动链可能因结果而异)
适用:processCombinedResult <$> action1 <*> action2 <*> action3
(行动链已修复)
遍历Traversable的内部结构所规定的Traversable动作指令时,并不依赖于彼此的结果。 Monad也可以使用,但它更具限制性,并且能够动态地连接动作&#34;取决于先前操作的结果,不需要实现这些功能。因此,选择Applicative作为限制较少的类,它提供所需的功能。