7.12 多相型アノテーション

(OCaml 3.12 〜)

let-binding ::= ...
| value-name : poly-typexpr = expr

let 定義中の多相型アノテーションは多相メソッドのように振る舞います。これにより、定義された値が多相的であることを要求し、(let rec 中で)再帰的に現れた場合に多相性を使うことができます。ただし、これは通常の多相型であり、自身の任意のインスタンスと単一化できるだけであることに注意してください。

この機能の利用法はふたつあります。ひとつは多相再帰です。

type 'a t = Leaf of 'a | Node of ('a * 'a) t
  let rec depth : 'a. 'a t -> 'b = function
      Leaf _ -> 1
    | Node x -> 1 + depth x
    

ここで、 'b は多相的であると指定していないことに注意してください。 'bint に単一化されます。

もうひとつの利用法は、ある定義が充分に多相的であることを保証するものです。

#let id : ’a. ’a -> ’a = fun x -> x+1 ;;
Error: This definition has type int -> int which is less general than
         ’a. ’a -> ’a