我正在尝试在 OCaml 中模拟一个接口(interface)并使用“类型”构造。我有两种类型:
type fooSansBar = {a: string; b: int};;
type fooConBar = {a:string; b:int; bar:char};;
...并想定义一个特定的 fooSansBar
:let fsb = {a="a"; b=3};;
...但有人告诉 bar
字段未定义。由此看来,与我传入的匹配 fooSansBar
的值相反的签名,系统认为我正在尝试创建 fooConBar
.是否可以创建 fooSansBar
如果存在上面定义的两种类型?此外(因为我是 OCaml 的新手)是否有更好的方法来模拟界面?
最佳答案
在 OCaml 中,记录类型中的字段名称必须是唯一的,因此您定义的两种类型不能同时共存。 Caml 是我知道的唯一具有此属性的语言。
因为第二个定义隐藏了第一个,所以当编译器看到 a 和 b 字段时,它期望它们属于 fooConBar
type 等提示缺少 bar 字段。
如果你试图模拟一个界面,在 Caml 中正确的函数方法是定义一个 module type
.
module type FOO_CON_BAR = sig
val a : string
val b : int
val bar : char
end
还有一个例子:
module Example = struct
let a = "hello"
let b = 99
let c = '\n'
end
使用模块和模块类型,您还可以获得子类型;没有必要求助于对象。
附言我的 Caml 生锈了;语法可能已关闭。
关于interface - 具有不同特异性水平的 OCaml 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/669641/