方永、南天紫云

道亦有道

理解单子是自函子范畴上的幺半群(五)
2024年09月05日

那么如何与编程语言相对应?

在编程语言中,将所有的类型(T)作为对象,它们之间的转换(F)作为态射,那么就形成了一个范畴(C)。

如果有一组函数(G),既可以将C中的一种类型转换为另一种类型,还可以将这些类型间的转换(F)进行转换,那么很明显, 这一组函数就是对范畴进行了变换,就是函子,而变换后范畴仍是C,那么这个函子就是自函子。

自函子G可能对应于编程语言中一个结构体(struct)的构造函数和作用于结构体上map函数。例如Rust语言中的Option类型, 构造函数是let v = Option(x);,map函数是Option上定义的and_then

再看单子的定义,单子 M = (F, unit, flatMap)

Option类型已经具备了F(即Option类型), unit(即Option的构造函数),那么只需实现flatMap,那么Option就是一个单子了, 而这个flatMap就是Option上定义的flatten,因此Option类型还是一个单子。

一般在函数式编程语言中,构造函数被称之为 returnunit, flatMap 称之为 bind

参考

  1. A Monad is just a Monoid in the Category of Endofunctors — Let’s actually unravel this.

  2. 单子 (函数式编程)