Ocaml - 多态打印和类型丢失

dem*_*emi 10 printing ocaml types runtime

在OCaml中有一系列函数,如print_int,print_endline和Printf.我做不了类似的事情:

let n = 10 in
print n;; (* And I haven't to change `print` in case type of `n` changed *)
Run Code Online (Sandbox Code Playgroud)

这就是Java,C#,Python等中的多态打印.相反,我们有类似C的类型,由程序员明确定义.所以我认为OCaml在编译过程中丢失了类型信息,并且在运行时没有它,对吧?这就是为什么我们还需要mli文件的原因?

编辑:我很累写函数像*print_listi*,*print_list_tuple2i*等等.我怎样才能做得更好?

cam*_*ter 21

你是对的:OCaml在运行时丢弃类型,因此没有办法区分你的10实际上是int或10th 0-ary变体构造函数.构造函数名称既不可用,也无法打印数据.

此外,OCaml的多态性是参数化的.您无法根据类型定义不同的函数.

一个部分解决方法是使用CamlP4自动生成数据类型的打印机功能.但是你仍然不能拥有适合一切的"polymagical"印刷品.您必须手动组合打印机,如print_list(print_option print_int).

几年前,我已经扩展了OCaml以获得这种多态打印(和其他好东西).它被称为GCaml.但不能维持很久.

mli文件与此无关.它们用于编写模块签名,用于隐藏模块用户的简单接口实现.

  • ygrek的答案更清楚。OCaml 在编译时是类型语言,但在运行时,它会平静地忘记类型,因为“类型良好的程序永远不会出错”。 (2认同)