多相的関数とパラメトリック多相

次の関数 thrd は3要素のタプルを引数にとって,3番目の要素を返す。

# let thrd (x, y, z) = z;;
val thrd : 'a * 'b * 'c -> 'c = <fun>

この, ‘a,’b,’c を型変数といい,thrd を適用するときには具体的にどんな型がきてもいい。つまり引数のタプルの各要素が,int であっても string であってもそれ以外のどんな型であってもいいってこと。

thrd のように型に関して抽象化された関数を多相的関数という。また,関数の型情報の一部をパラメータ化することによって発生する多相性をパラメトリック多相という。

# thrd ("foo", 2, 3.0);;
- : float = 3.
# thrd ('1', 2.0, (3, "three"));;
- : int * string = (3, "three")