interface - 具有不同特异性水平的 OCaml 类型

标签 interface ocaml

我正在尝试在 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/

相关文章:

java - 缩进接口(interface)的多个实现的公认做法是什么

c - 带有 getifaddrs 的 MAC 地址

java - 如何从 ColdFusion 实现 Java 接口(interface)?

Java DAO 对象事务

lisp - Ocaml 等同于 Lisp 的 let*?

java - 协议(protocol)的 JVM Clojure 实现如何工作?

ocaml - 与 Python 的 range 函数等效的 OCaml 习语是什么?

模块及其类型的继承

set - OCaml 中的异构集

memory-management - 覆盖内存中的数据