gpt4 book ai didi

haskell - 如何进行泛化?

转载 作者:行者123 更新时间:2023-12-02 10:52:47 26 4
gpt4 key购买 nike

之前,它曾经有 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)

为什么他们选择 applicative 而不是 monad?

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

最佳答案

选择应用程序是因为我们想要链接操作,但操作顺序不依赖于先前的结果。

单子(monad):action1 >>= \resultOfAction1 -> if P(resultOfAction1) then action1 else action2 (行动链可能会根据结果而变化)

适用:processCombinedResult <$> action1 <*> action2 <*> action3 ( Action 链固定)

遍历 Traversable 时的 Action 顺序由 Traversable 的内部结构决定,并且不依赖于彼此的结果。也可以使用 Monad,但它的限制更多,并且它能够根据先前操作的结果“动态”链接操作,而实现这些功能并不需要。因此,选择 Applicative 作为限制较少的类,提供所需的功能。

关于haskell - 如何进行泛化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45711268/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com