gpt4 book ai didi

haskell - Traversable is to Applicative contexts 是什么意思?

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

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

作者在某处提到过下面这句话:

Traversable is to Applicative contexts what Foldable is to Monoid values.

他试图澄清什么?

我没有得到Foldable 到 Monoid 之间的联系。

请提供示例。

最佳答案

一开始,有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 约束比必要的要强。)

Applicative 本质上是幺半群的,因此在 Traverse 中不需要区分 foldr/foldMap 的类型 抽奖。

关于haskell - Traversable is to Applicative contexts 是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55533260/

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