OCaml:Core.Univ 用法示例

OCaml: Core.Univ usage example

所以我一直在研究 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 实例?

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

请记住,一旦您编译了您的程序,在运行时 OCaml 中(几乎)没有任何类型(例如,请参阅 here or here 了解更多信息)。

这意味着无法自省由 Core.Type_equal.Id.create 编辑的值 return 来检测它们的真实类型,因此无法检测您是否已经调用了 create一个现有的相同类型(这将允许 return 一个已经创建的标识符)。

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