Types Ocaml-多态打印和类型丢失

Types Ocaml-多态打印和类型丢失,types,printing,runtime,ocaml,Types,Printing,Runtime,Ocaml,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 *) 这就是Java、C#、Python和其他语言中的多态打印。相反,我们使用了类C语言,其类型由程序员显式定义。所以我认为OCaml在编译过程中丢失了类型信息,而在运行时却没有,对吗?这就是为什么我们也需要mli文件

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 *)
这就是Java、C#、Python和其他语言中的多态打印。相反,我们使用了类C语言,其类型由程序员显式定义。所以我认为OCaml在编译过程中丢失了类型信息,而在运行时却没有,对吗?这就是为什么我们也需要mli文件的原因


编辑:我已经厌倦了编写诸如*print\u listi*、*print\u list\u tuple2i*等函数。我怎样才能做得更好呢?

你说得对:OCaml在运行时丢弃类型,因此无法区分10是一个真正的int或10个0元变量构造函数。构造函数名称都不可用,因此无法打印数据

此外,OCaml的多态性是参数化的。不能根据类型定义工作方式不同的函数

其中一个部分解决方法是使用CamlP4自动生成数据类型的打印机功能。但是,你不可能拥有适用于一切事物的“多魔法”印刷品。您必须手动组合打印机,如print\u list(print\u选项print\u int)

几年前,我扩展了OCaml,使其具有这样的多态打印(和其他好东西)。它叫GCaml。但并没有维持很久


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

好的,有模块和所有与之相关的东西。至少这是一个改进,并且有点类型安全。我没有做足够的ocaml来知道是否还有其他内置的替代品。回答得好!请澄清“参数多态性”是什么意思?不要同意mli:想象一下你已经遵守了你的图书馆。类型丢失。在没有mli的情况下,如何获得函数签名?类型不会丢失-编译后的接口始终可用-如果不提供mli文件,ocaml将推断并自动编译它(所有类型和值都已公开)。此外,此信息在编译时使用,而不是在运行时使用。这与你第一个问题的本质无关。伊格里克的答案更清楚。OCaml在编译时是类型化语言,但在运行时,它会和平地忘记类型,因为“类型良好的程序永远不会出错”。只有当部分纯粹是一个参数并且函数从未访问过时,OCaml函数类型才可以是多态的。例如,类型为'a->unit的唯一可能的多态函数是let ignore x=(),对一些琐碎的副作用进行模化,如let ignore'x=print_string“我有东西!”;(). 例如,如果函数访问参数,就不要忽略x=x+1;()那么它就不再是多态的了。打印函数必须接触参数,因此它不能是参数多态的。非参数多态性可以处理此类函数,但OCaml没有。