让类型也成为参数
某个函数若只交换一对值的位置,不需要分别为整数、字符串和其他类型重写同一个过程。类型参数可以说明两个输入各属什么类型,以及输出怎样保留这些关系。算法因而能够在不同具体类型上复用,同时让类型检查继续约束每次调用的输入与结果。
参考:[1]
一般性仍有一致性要求
类型变量代表尚未选定的类型,但同一变量在一处实例化之后,其余对应位置必须一致。例如返回原输入的函数,不能在没有其他规则的情况下把整数输入变成字符串结果。参数多态由此区别于“随便什么都可以”:它保留的是跨类型共同成立的结构与关系。
参考:[1]
数据结构也能参数化
列表类型可以带有元素类型参数,分别得到整数列表、文本列表或其他列表。统一的长度计算只需要遍历结构,不必理解每个元素;而对元素求和则需要额外的运算依据。一个带类型参数的列表,也不自动意味着同一列表中每个位置都能放入互不相干的类型。
参考:[1]
可变状态为何限制一般性
如果一个函数闭包在内部保留可变状态,不同调用之间就可能相互影响,不能总把它当作完全独立的通用转换。OCaml的值限制与弱类型变量处理这类问题,避免一份共享存储被不相容的类型重复解释。参数多态的范围因此取决于类型规则与副作用的配合,而不仅是是否省略声明。
参考:[2]