主要观点:用“寻找守恒量”的直觉来理解 Haskell 中的 Functor 及相关抽象,如 fmap 保持的“形状”及改变的“结果”,并由此延伸到 Traversable、Applicative、Alternative、Monad 等类型类及自由结构(free structures)。
关键信息:
- Functor:
fmap保持“形状”,不同 Functor 保持的“形状”不同,如列表的长度、可选类型的存在性等,且每个合法的 Functor 实例都诱导出一个守恒量,可称为“形状”。 - Traversable:
Traversable让我们能映射“有效果的”函数并保持形状,如Map k的遍历实例能在不改变键的情况下映射函数。 - Applicative:
Applicative给我们一种组合形状的方式,不考虑结果,其定律与 Functor 诱导的“形状”相关,很多库利用了其“知道形状而不知结果”的特性。 - Alternative:
Alternative的<|>与<*>类似,但组合形状的幺半群不同,引入了结果的基本数据依赖,形状合并与结果相关。 - Monad:
Monad允许最终动作的形状依赖于第一个动作的结果,如IO中动作的形状依赖于执行结果,Monad使得guard等操作有用,且某些类型没有Monad实例。 - Free Structures:通过指定形状并使用
Ap(用于自由 Applicative)或Free(用于自由 Monad)创建相应的 Applicative 或 Monad,理解形状有助于选择合适的自由结构。
重要细节:
- 以各种类型为例说明 Functor 保持的“形状”,如列表的长度、
Map的键等。 - 详细解释
Applicative中不同实例的组合形状方式,如Writer的mappend、列表的乘法等。 - 对比
Applicative和Alternative在形状和结果依赖上的差异。 - 举例说明
Monad中动作形状依赖结果的情况,如IO操作和解析器组合。 - 通过自定义的
Option和Single类型展示自由结构的创建和使用。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。