作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
之前,它曾经有 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)
为什么他们选择 applicative 而不是 monad?
它们如何成为概括mapM
和sequence
的想法?当我必须更抽象时,我想理解这个过程。如您所见,函数 mapM
和 sequence
仅适用于列表,但 traverse
和 sequenceA
更加抽象和适用于所有实现了 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/
我是一名优秀的程序员,十分优秀!