Один из способов чтения типов функций, таких как unit -> 'a
, - помнить, что переменная типа 'a
содержит пустые типы.
Например, если у меня есть функция f
let rec f:'a. _ -> 'a = fun () -> f ()
и пустой тип
type empty = |
(* using 4.07 empty variants *)
(* or *)
type (_,_) eq = Refl: ('a,'a) eq
type empty = (float,int) eq
, тогда я могу ограничить тип f unit -> empty
:
let g: unit -> empty = f
Более того, более общий тип f
может бытьполезно при наличии веток.Например, я мог бы определить return
, который вызывает исключение для раннего выхода из цикла for:
let search pred n =
let exception Return of int in
let return: 'a. int -> 'a = fun n -> raise (Return n) in
try
for i = 0 to n do
if pred i then return i
done;
None
with Return n -> Some n
Здесь полиморфный тип return
позволяет использовать его вконтекст, в котором ожидалось unit
.