那么如何与编程语言相对应?
在编程语言中,将所有的类型(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类型还是一个单子。
一般在函数式编程语言中,构造函数被称之为 return
或 unit
, flatMap
称之为 bind
。