【发布时间】:2018-05-22 04:57:43
【问题描述】:
是否可以显式写下非多态但延迟统一的类型,如下划线类型?
因此,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
并且不依赖于将来可能会消失的类型系统的限制。
【问题讨论】:
-
请问为什么你会想要这样做?
-
@AndreasRossberg,当时我正在为用 C 编写的库编写 OCaml 接口。有问题的特定项目倾向于避免使用
.mli文件。回想起来,这不是一个好方法。
标签: ocaml