观念
单子 (monad) 是一种具有许多理解方式的对象, 很难说哪种理解最为基本:
- 范畴 $\mathcal C$ 上的单子是自函子范畴 $\operatorname{End}(\mathcal C)$ 中的结合代数; 在这种意义上它是结合代数的范畴化.
- 幺半范畴 $\mathcal C$ 中的一个结合代数 $A$ 给出 $\mathcal C$ 上的一个单子 $A\otimes(-)$; 在这种意义上单子是结合代数的推广; 单子上的模 (或叫单子上的代数) 是结合代数上的模的推广.
- 单子是代数理论的推广. 许多代数结构可理解为某个单子上的代数; 此时这个单子给出 “自由代数”. 这件事可由单子性函子描述.
- 在 $2$-范畴的理论中, 单子可视为 $1$ 到 $\mathsf{Cat}$ 的松函子, 从而进一步推广为 $1$ 到一般的 $2$-范畴的松函子.
代数结构
单子是记录许多代数结构的统一的工具. 对于每种代数结构都有一个自由函子, 对应的单子是自由和遗忘的复合, 一般的结构则是单子上的代数.
- 对于环 $R$, $R$-模是单子 $T_R := R\otimes -\colon \mathsf{Ab}\to\mathsf{Ab}$ 上的代数.
- 考虑张量代数单子 $T\colon \mathsf{Ab} \to \mathsf{Ab}$, 那么一个环等同于一个 $T$-代数.
- 考虑自由群单子 $T_{\mathrm{Grp}}\colon \mathsf{Set} \to \mathsf{Set}$, 那么一个群等同于一个 $T_{\mathrm{Grp}}$-代数. 更一般地, 每个 Lawvere 理论都给出 $\mathsf{Set}$ 上的一个单子 $T$. 记 $T(n)$ 为该理论中所有可能的 $n$ 元项的集合, 例如群的理论中 $x^2 y^{-1}x$ 是一个 $2$ 元项. 那么函子 $T$ 可表示为
$$
TX = \int_{N\in\mathsf{Fin}} T(N)\times X^N.
$$
这是一个余端记号, 可以粗略地理解为对所有 $N$ 取并, 然后商掉必要的关系.
- 对于 $\mathsf{Ani}$-值单色算畴 $\mathcal O$, 我们有 ($\mathsf{Ani}$ 上的) 自由 $\mathcal O$-代数单子
$$
T_{\mathcal O} X = \int_{N\in\mathsf{Fin}^\simeq} \mathcal O(N)\times X^N.
$$
例如自由 $\mathbb E_n$-代数单子
$$
T_{\mathbb E_n}X = \int_{N\in\mathsf{Fin}^\simeq}\operatorname{Conf}_N(\mathbb{R}^n)\times X^N.
$$
注意, 与 Lawvere 理论不同的是, 这里余端的指标范畴为群胚 $\mathsf{Fin}^\simeq$. 本讲的第一个主要目标便是用这种方式解释什么是算畴.
有一些看起来不那么 “代数” 的结构也可以用单子来记录. 关键在于, “不那么代数” 的信息被储存在了一个基范畴中, 而单子本身只负责记录 “代数” 运算.
- 考虑有向图的范畴 $\mathsf{Graph}$, 其对象为两个生象带有两个映射 $E\rightrightarrows V$, 其上有一个自由范畴单子 $T_{\mathsf{Cat}}\colon \mathsf{Graph}\to\mathsf{Graph}$, 这个单子上的代数就是范畴.
- 算畴 (多重范畴) 也可以类似定义, 底层的结构是树. 树与图的区别在于它能记录 “多个对象到一个对象的态射”. 这是本讲的第二个主要目标. 注意在本讲中, 算畴 (多重范畴) 有了两个不同层次的角色: 先是一个算畴定义一种结构, 然后算畴这种结构本身也可以用单子来定义.
在上述每个例子中, “自由代数” 单子都不仅仅是单子, 而是所谓带元数的单子 (或脉性单子). 元数 (arity) 的本义是一个函数的自变量的个数, 例如加法的元数是 $2$, 取逆的元数是 $1$, 而常数的元数是 $0$.
如果定义一种代数结构的每种运算只涉及了一个集合里有限个元素, 那么一个代数 $X$ 就可以被全体有限集 $A$ 生成的自由代数 $TA$ 探测. 所谓探测就是说用全体态射 $TA\to X$ 的信息可以完全恢复出 $X$ 的信息. 这就是带元数的单子的直观.
计算机科学
单子也是计算机科学中的重要概念, 因为它表达了许多计算过程中的现象: 一个计算 “本该” 输出类型 $X$ 的数据, 而实际上输出的是与 $X$ 有关的一个类型 $TX$ 的数据. 例如
- 除法运算 “本该” 输出一个类型为 $\mathbb{R}$ 的数据, 但实际上输出的是一个数或者一个异常 NaN (比如除以 $0$). 实际上的输出类型是 $\mathsf{Maybe}(\mathbb{R}) := \mathbb{R} \sqcup \{\text{NaN}\}$. 这就是可能单子 (maybe monad).
- 计算机语言中的一个 “函数” $A\to B$ 不一定是数学意义上的函数, 因为它可能在运行中改变了环境. 以 $S$ 表示环境可能处于的状态的全体, 那么这个 “函数” 实际上的输出类型是 $S\to (B\times S)$, 也就是 “从旧环境得到一个类型 $B$ 的数据, 并给出新环境”. 这就是状态单子 (state monad).
详见单子 (计算机科学).
定义
自函子范畴中的结合代数
一个范畴 $\mathcal C$ 上的单子是其自函子范畴 $\operatorname{End}(\mathcal C)$ 中的结合代数. 对偶范畴 $\mathcal C^{\mathrm{op}}$ 上的单子称为 $\mathcal C$ 上的余单子.
更具体地, 一个 ($1$-)范畴 $\mathcal C$ 上的单子是一个函子 $T\colon \mathcal C\to\mathcal C$, 带有自然变换
$\eta\colon \mathrm{id}\to T$, $\mu\colon T^2\to T$, 且有两个自然变换 $T^3\to T$ 之间的同构.
当然, 上述定义中的 $\mathcal C$ 也可设为任何 $2$-范畴的对象. 例如, 考虑具有某一类余极限的范畴构成的 $2$-范畴, 那么其中一个对象上的单子即为保持这类余极限的单子.
松 2-函子
等价的定义是, 单子为 $2$-范畴之间的松函子
$$
1\to \mathsf{Cat}.
$$
一般地, $2$-范畴 $\mathcal C$ 内的一个单子定义为松函子 $1 \to \mathcal C$ (注意区分一个对象上的单子与一个 $2$-范畴内的单子).
性质
Kleisli 范畴
对范畴 $\mathcal C$ 上的单子 $T$, 有一个范畴, 称为 Kleisli 范畴 $\mathsf{Kl}$,
- 其对象为 $\mathcal C$ 的对象,
- $\mathsf{Kl}$ 中的态射 $X\to Y$ 为 $\mathcal C$ 中的态射 $X\to TY$,
- $\mathsf{Kl}$ 中的态射 $X\to Y$, $Y\to Z$ 的复合为 $\mathcal C$ 中的如下复合:
$$
X \to TY \to TTZ \overset{\mu}{\to} TZ.
$$
例
伴随给出单子
任何一对函子 $L\colon \mathcal C\to\mathcal D$, $R\colon \mathcal D\to\mathcal C$ 之间的伴随 $L\dashv R$ 都给出一个单子 $RL\colon \mathcal C\to\mathcal C$ 与一个余单子 $LR\colon \mathcal D\to\mathcal D$. 见伴随给出单子. 事实上任何单子都是某一对伴随给出的.
Set 上的单子
考虑带基点集合 $\mathsf {Set}_*$ 到 $\mathsf {Set}$ 的遗忘函子, 其对应的自由函子 (左伴随) 是对集合添加一个新的点作为基点. 这对伴随的单位 $\operatorname{id}_{\mathsf {Set}}\to RL$ 是对集合添加一个新的点. 这在计算机科学中称作可能单子 (maybe monad).
固定集合 $S$, 称为状态集合 (set of states), 张量-同态伴随 $(S\times)\dashv (-)^S$ 的单位 $(S\times -)^S$ 称为状态单子 (state monad).
结合代数
设 $A$ 是幺半范畴 $(\mathcal C,\otimes)$ 中的结合代数, 则有单子 $A\otimes(-)\colon \mathcal C\to\mathcal C$ 以及 $(-)\otimes A\colon \mathcal C\to\mathcal C$. 这是因为
$$
A \mapsto (A\otimes (-)) \colon \mathcal C \to \operatorname{End}(\mathcal C)
$$
是幺半函子, 从而将结合代数 $A$ 变为单子.
例. 增广单纯形范畴 $\Delta_+$ 中的对象 $[0]$ 是游走的结合代数. 与该结合代数作张量积的函子 $[0] \otimes - \colon \Delta_+ \to \Delta_+$ 等同于对全序集添加一个最小元, $-\otimes [0] \colon \Delta_+ \to \Delta_+$ 则是添加一个最大元.
偏序集上的单子
偏序集 $(P,\leq)$ 上的单子 $T\colon P\to P$ 须满足 $x\leq Tx$, $T^2 = T$. 这种映射又叫 “闭包算子”. 例如拓扑空间的开集的偏序集 $\operatorname{Open}(X)$ 上的闭包运算是一个单子.
另见 Lawvere–Tierney 拓扑.
相关概念
算畴, 杠构造