代数类型的实质是,生成类似代数结构类型的一种类型函数(Type Function 或 Type Former),其输入是类型,输出是带有代数结构的类型。主要包括了 积类型(Product Type)、和类型(Sum Type)以及 指数类型(Exponential Type)。因此,代数类型并不指是一种特定的类型,如自然数,整数等,而是所有的带有特定的代数结构的类型的统称。
类型大小(Size)
在解析为什么叫代数类型前,需要回顾一下,在《类型即可构建集合》 一文中描述到类型是一种集合,所包含的各个元素都必须是可构建的。换言之,在定义一个类型的时候,需要定义其所包含的元素是如何构造的。因此,在有限集的情况下,可以计算出每个类型的大小(size),即类型包含的元素个数。记为 |A|,A为类型。
积类型(Product Type)
定义如下,给定两个类型 A和B,生成新的类型 (A,B)。
Product: A -> B -> (A, B)
此时,| (A,B)| = |A| × |B|,由此,该类型函数被成为,积类型。
和类型(Sum Type)
定义如下,给定两个类型 A和B,生成新的类型 A+B。
Sum: A -> B -> A + B
此时,| A + B | = |A| + |B|,由此,该类型函数被成为,和类型。
指数类型(Exponent Type)
定义如下,给定两个类型 A和B,生成新的类型 A -> B,因此也称函数类型。
Exp: A -> B -> (A -> B)
此时,| A -> B | = |B| ^ |A|,由此,该类型函数被成为,指数类型。
延伸
此时,我们讨论里,有个隐含的背景是,类型函数的输入只能是类型,如果类型函数的输入可以是值,也可以是类型的话,我们便有了依赖类型 (Dependent Type)。
也就是说,函数有输入输出两端,输出依赖着输入,然后把输入输出分为值和类两种,就有 2x2 = 4种。分别是
1. 值 -> 值,普通函数
2. 值 -> 类,依赖类型函数
3. 类 -> 值,多态
4. 类 -> 类,类型函数
后面,笔者会有相关文章再仔细说说。