首页 > 解决方案 > Traversable 对 Applicative 上下文意味着什么?

问题描述

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

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

Traversable 对于 Applicative 上下文就像 Foldable 对于 Monoid 值一样。

他试图澄清什么?

我不明白之间的联系Foldable to Monoid

请举个例子。

标签: haskellapplicativemonoidstraversablefoldable

解决方案


一开始,有foldr

foldr :: (a -> b -> b) -> b -> [a] -> b

mapM

mapM :: Monad m => (a -> m b) -> [a] -> m [b]

foldr被推广到数据类型,而不是[a]让每种类型定义自己的定义foldr来描述如何将其简化为单个值。

-- old foldr ::        (a -> b -> b) -> b -> [] a -> b
foldr :: Foldable t => (a -> b -> b) -> b -> t  a -> b

如果你有一个幺半群,你不必指定一个二元函数,因为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

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)

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

AnApplicative本质上是幺半群,因此不需要/绘制Traverse的区分类型。foldrfoldMap


推荐阅读