怎么做泛化?

时间:2017-08-16 10:35:47

标签: haskell

之前,它曾经有mapsequence以下实施:

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?

他们如何成为概括mapMsequence的想法?我想了解这个过程,当我必须更抽象时。如您所见,函数mapMsequence仅适用于列表,但traversesequenceA更抽象,适用于已实现Traversable的所有数据类型。

1 个答案:

答案 0 :(得分:2)

选择申请是因为我们想要连锁行动但行动顺序不依赖于以前的结果。

Monad:action1 >>= \resultOfAction1 -> if P(resultOfAction1) then action1 else action2(行动链可能因结果而异)

适用:processCombinedResult <$> action1 <*> action2 <*> action3(行动链已修复)

遍历Traversable的内部结构所规定的Traversable动作指令时,并不依赖于彼此的结果。 Monad也可以使用,但它更具限制性,并且能够动态地连接动作&#34;取决于先前操作的结果,不需要实现这些功能。因此,选择Applicative作为限制较少的类,它提供所需的功能。