遍历对应用上下文意味着什么?

zer*_*ing 7 haskell applicative monoids traversable foldable

我试图在https://namc.in/2018-02-05-foldables-traversals的帮助下了解Traversable 。

作者在某处提到了以下句子:

对应用上下文而言,可遍历是针对Monoid值的可折叠。

他试图澄清什么?

我之间没有联系Foldable to Monoid

请提供一个例子。

che*_*ner 8

最初,有foldr

foldr :: (a -> b -> b) -> b -> [a] -> b
Run Code Online (Sandbox Code Playgroud)

并且有mapM

mapM :: Monad m => (a -> m b) -> [a] -> m [b]
Run Code Online (Sandbox Code Playgroud)

foldr除了[a]让每种类型定义自己的定义foldr以描述如何将其减少为单个值外,还对数据类型进行了通用化。

-- old foldr ::        (a -> b -> b) -> b -> [] a -> b
foldr :: Foldable t => (a -> b -> b) -> b -> t  a -> b
Run Code Online (Sandbox Code Playgroud)

如果有一个monoid,则不必指定二进制函数,因为该Monoid实例已经提供了自己的起始值,并且知道如何组合两个值,这从其默认定义中可以明显看出foldr

-- If m is a monoid, it provides its own function of type b -> b.
foldMap :: (Foldable t, Monoid m) => (a -> m) -> t a -> m
foldMap f = foldr (mappend . f) mempty
Run Code Online (Sandbox Code Playgroud)

Traverse从列表到可遍历类型进行相同类型的概括,但适用于mapM

-- old mapM ::              Monad m        => (a -> m b) -> [] a -> m ([] b)
traverse :: (Traversable t, Applicative f) => (a -> f b) -> t  a -> f (t  b)
Run Code Online (Sandbox Code Playgroud)

mapM最初定义时,没有Applicative类;如果有,则mapA :: Applicative f => (a -> f b) -> [a] -> f [b]可以定义;而Monad约束比必需的要强。)

An Applicative本质上是单调的,因此不需要/ Traverse区分的类型。foldrfoldMap