OCaml:Core.Univ用法示例

时间:2015-03-24 16:51:34

标签: ocaml ocaml-core

所以我一直在将Core.Univ视为构建异构数组的一种方式。

假设我

let int_type = Core.Type_equal.Id.create ~name:"" Sexplib.Conv.sexp_of_int;;
let int_type' = Core.Type_equal.Id.create ~name:"" Sexplib.Conv.sexp_of_int;;

let i = Core_kernel.Univ.create int_type 5;;
let j = Core_kernel.Univ.create int_type' 5;;

当我这样做时

Core_kernel.Univ.match_ i int_type'

它与预期不符,因为Type_equal.Id的文档说两次调用具有完全相同参数的create将导致两个不同的标识符。

这是否意味着API用户有责任确保每种类型只存在一个Type_equal.Id个实例?

1 个答案:

答案 0 :(得分:2)

是。我说Core的术语在这里有点不幸。

请记住,编译程序后,在运行时OCaml中几乎没有类型(例如,请参阅herehere以获取更多信息)。

这意味着无法自省Core.Type_equal.Id.create返回的值来检测它们实际属于哪种类型,因此无法检测是否已针对现有相同类型调用create type(允许返回已创建的标识符)。

您应该将这些值视为键入的键标识符,而不是类型的标识符。通过控制谁可以通过模块系统访问这些密钥标识符,您可以以类型安全的方式控制谁可以访问使用它们创建的通用值的内容。