单子转换器

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

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

比如:

  • 可变状态通过具有相同类型的函数参数和返回值来编码
  • 错误处理通过具有类似于 Except 的返回类型来编码,该类型具有用于表示成功和失败的构造函数
  • 通过将返回值与日志配对,对日志进行编码

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