范畴论要解释 Monad,就必须提到范畴论(Category Theory)。范畴(category)本身是一个很简单的概念。一个范畴由对象(object)以及对象之间的箭头(arrow)组成。范畴的核心是组合,体现在箭头的组合性上。如果从对象 A 到对象 B 有一个箭头,从对象 B 到对象 C 也有一个箭头,那么必然有一个从对象 A 到对象 C 的箭头。从 A 到 C 的这个箭头,就是 A 到 B 的箭头和 B 到 C 的箭头的组合。这种组合的必然存在性,是范畴的核心特征。以专业术语来说,箭头被称为态射(morphisms)。范畴中对象和箭头的概念可以很容易地映射到函数中。类型可以作为范畴中的对象,把函数看成是箭头。如果有一个函数 f 的参数类型是 A,返回值类型是 B,那么这个函数是从 A 到 B 的态射;另外一个函数 g 的参数类型是 B,返回值类型是 C,这个函数是从 B 到 C 的态射。可以把 f 和 g 组合起来,得到一个新的从类型 A 到类型 C 的函数,记为 g ∘f,也就是从 A 到 C 的态射。这种函数的组合方式是必然存在的。
一个范畴中的组合需要满足两个条件:
组合必须是传递的(associative)。如果有 3 个态射 f、g 和 h 可以按照 h∘g∘f 的顺序组合,那么不管是 g 和 h 先组合,还是 f 和 g 先组合,所产生的结果都是一样的。
对于每个对象 A,都有一个作为组合基本单元的箭头。这个箭头的起始和终止都是该对象 A 本身。当该箭头与从对象 A 起始或结束的其他箭头组合时,得到的结果是原始的箭头。以函数的概念来说,这个函数称为恒等函数(identity function)。在 Java 中,这个函数由 Function.identity() 表示。