haskell - Traversable 对 Applicative 上下文意味着什么?
问题描述
我试图在https://namc.in/2018-02-05-foldables-traversals的帮助下理解 Traversable 。
作者在某处提到了以下句子:
Traversable 对于 Applicative 上下文就像 Foldable 对于 Monoid 值一样。
他试图澄清什么?
我不明白之间的联系Foldable to 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
约束比必要的要强。)
AnApplicative
本质上是幺半群,因此不需要/绘制Traverse
的区分类型。foldr
foldMap
推荐阅读
- python - Pandas:将一对多与日期间隔合并
- php - 如何在 Symfony Easy admin crud 面板中创建下拉选择?
- visual-studio-code - 调试停止时 Xdebug 不会终止 PHP 脚本
- r - 如何对数据框进行分组,以便列包含逻辑“是”/“否”值?
- android - 我得到一个提示,声明 'build' , 'initstate', 'dispose', loadModel' 没有被引用。我应该怎么办?
- jira - 我们如何使用 Jira 测试上传 Jira 产品
- javascript - 一些 WinRT 功能在 Xbox 上失败,但在 Windows 10 上没有
- javascript - 在 Dash 中为悬停跟踪图像创建客户端回调(修订)
- excel - 需要将索引公式切换到 VBA 以允许我返回真正的空白
- google-apps-script - Classroom.Courses.CourseWork.patch