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 文件的原因?
EDIT:我厌倦了编写 *print_listi*、*print_list_tuple2i* 等函数。我怎样才能做得更好?
你是对的:OCaml 在运行时丢弃类型,因此无法区分你的 10 是否真的是 int 或第 10 个 0 元变体构造函数。构造函数名称都不可用,因此无法打印数据。
而且,OCaml的多态性是参数化的。您不能定义根据类型不同而工作方式不同的函数。
对此的一种部分解决方法是使用 CamlP4 自动生成数据类型的打印机函数。但是,你仍然不可能拥有适用于所有情况的“多魔法”印刷品。您必须手动组合打印机,例如 print_list (print_option print_int)。
几年前我已经扩展了 OCaml 来拥有这样的多态打印(和其他好的东西)。它称为 GCaml。但维护时间不长。
mli
文件与此无关。它们用于编写模块签名,为模块用户隐藏更简单接口的实现。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)