我听说OCaml 3.12中有“头等舱模块”。它们有什么优势?什么孩子的事情会更容易?他们试图解决什么问题?一个简单的例子就足够了。
答案 0 :(得分:13)
它只是一个可能的应用程序,但是第一类模块可以很容易地编码存在类型,基本上是一个模块打包存在类型和使用这种类型的值)。例如,请参阅Alain Frisch关于动态类型的工作(代码取自Alain Frisch关于dyntypes的工作:http://caml.inria.fr/cgi-bin/viewvc.cgi/ocaml/branches/dyntypes/stdlib/dyntypes.ml?view=markup)
module type DYN = sig
type t
val x: t
val t: t ttype
end
type dyn = (module DYN)
let dyn (type s) t x =
let module M = struct
type t = s
let x = x
let t = t
end
in
(module M : DYN)
这里的想法是“ttype”是该类型的具体表示,具有Int,Float构造函数等的代数数据类型,并且您在这里有一个值,其类型是隐藏的,但它带有一个具体的表示形式该类型,您可以使用它来获得更安全的序列化/反序列化。
答案 1 :(得分:12)
也许有点迟了,但新论文First-class modules: hidden power and tantalizing promises正是关于主题的。这是一套关于一流模块的食谱/珍珠,由Oleg Kiselyov(oleg)和Jeremy Yallop(例如,Deriving项目的作者)。