Можно ли явно записать тип, который не является полиморфным, но имеет задержку объединения, например, типы подчеркивания?
Итак, OCaml иногда создает тип, который верхний уровень печатает с начальным подчеркиванием (например,_a
) в процессе проверки типов.В частности, они появляются при создании пустого Hashtbl.t
и при некоторых других обстоятельствах.
# Hashtbl.create 1;;
- : ('_a, '_b) Hashtbl.t = <abstr>
Однако эти типы не могут быть явно указаны пользователем в исходном коде.
# (5: int);;
- : int = 5
# (5: 'a);;
- : int = 5
# (5: '_a);;
Error: The type variable name '_a is not allowed in programs
Вы можете создать явно неполиморфную функцию, воспользовавшись отсутствием полиморфизма более высокого ранга в OCaml
# let id = snd ((), fun y -> y);;
val id : '_a -> '_a = <fun>
# (fun () -> fun y -> y) ();;
- : '_a -> '_a = <fun>
Я хотел бы иметь возможность сделать что-то вроде
let id : <some magical type> = fun x -> x
ине полагаться на ограничение системы типов, которое может исчезнуть в будущем.