Lean 函数式编程

6. 单子转换器🔗

单子是一种在纯语言中编码某些副作用的方式。不同的单子可以编码不同的副作用,例如状态和错误处理。很多单子甚至会提供在大多数语言中不可用的有用作用,例如非确定性搜索、读取器,甚至续体。

一个典型的应用程序有一组易于测试的不包含单子的核心函数,并配对了一个使用单子来编码必要应用逻辑的外部封装。这些单子是由常见的组件构建的。

比如:

  • 可变状态通过具有相同类型的函数参数和返回值来编码

  • 错误处理通过具有类似于 Except 的返回类型来编码,该类型具有用于表示成功和失败的构造函数

  • 通过将返回值与日志配对,对日志进行编码

然而,手动编写每个单子是繁琐的,需要定义各种类型类的样板代码。每个组件也都可以提取到一个定义中,该定义修改某个其他单子以添加额外的作用。这种定义称为单子转换器(Monad Transformer)。一个具体的单子可以从一组单子转换器构建,从而实现更多代码的重用。

  1. 6.1. 组合 IO 与 Reader
  2. 6.2. 单子构建工具包
  3. 6.3. 对单子转换器排序
  4. 6.4. 更多 do 的特性
  5. 6.5. 其他便利功能
  6. 6.6. 总结