(OCaml 3.12 〜)
| parameter | ||
| ( type typeconstr-name ) |
式 fun ( type typeconstr-name ) -> expr は expr のスコープに typeconstr-name という型構成子を導入します。この構成子はスコープ内では抽象として扱われますが、それ以降では新しい型変数に置き換えられます。構文とは対照的に fun ( type typeconstr-name ) -> expr 自体は、通常の抽象とは異なり、 expr の評価を中断しません。この構文は、一般的な用法であるところの、関数の宣言の文脈に合うように選ばれました。次のように、通常の関数の引数と疑似型パラメータを自由は自由に混ぜることができます。
let f = fun (type t) (foo : t list) -> ...
関数宣言の代替構文でも使うことができます。
let f (type t) (foo : t list) = ...
この構文で導入される型構成子は、型変数を使うことのできない場所でも使うことができます。例えば、多相関数内の局所モジュールで例外を定義するのに使えます。
let f (type t) () =
let module M = struct exception E of t end in
(fun x -> M.E x), (function M.E x -> Some x | _ -> None)
別の例を挙げます。
let sort_uniq (type s) (cmp : s -> s -> int) =
let module S = Set.Make(struct type t = s let compare = cmp end) in
fun l ->
S.elements (List.fold_right S.add l S.empty)
この構文は、導入した型変数を多相的にしませんが、必要であれば、多相型アノテーションと組合せて使うこともできます。これは第一級のモジュールを使うときに非常に便利です。