我试图模拟OCaml中的接口,并使用"类型"构造.我有两种类型:
type fooSansBar = {a: string; b: int};; type fooConBar = {a:string; b:int; bar:char};;
...并且想要定义一个特定的fooSansBar:
let fsb = {a="a"; b=3};;
...但是我被告知条形区域没有定义.由此看来,与我在匹配fooSansBar签名时传递的值相反,系统认为我正在尝试创建一个fooConBar.如果存在上面定义的两种类型,是否可以创建fooSansBar?
另外(因为我是OCaml的新手)有更好的方法来模拟界面吗?
在OCaml中,记录类型中的字段名称必须是唯一的,因此您定义的两种类型不能同时共存.Caml是我所知道的唯一一种语言.
因为第二个定义隐藏了第一个定义,当编译器看到a和b字段时,它期望它们属于该fooConBar
类型,因此会抱怨缺少的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
使用模块和模块类型,您也可以获得子类型; 没有必要求助于物体.
PS我的Caml生锈了; 语法可能已关闭.