OCaml中模块的继承

Sof*_*mur 2 inheritance ocaml module

我已经定义了一个接口和一个模块:

module type BASE =
  sig
    type 'a base
    val ...
    ...
  end

module base =
  (struct
    type 'a base
    let ...
    ...
  end: BASE) 
Run Code Online (Sandbox Code Playgroud)

我想定义另一个DERIVED继承自的接口BASE,它包含所有类型和签名BASE,并有自己的类型和声明.然后我可以定义另一个Derived类型为的模块DERIVED.

谁能告诉我怎么做?它是否必然是OCaml的对象特征?

更进一步,是否可以更改类型的名称DERIVED:例如,它被调用'a derived而不是' a base

gas*_*che 5

您可以include在签名和实现上使用.

module type DERIVED = sig 
  include BASE
  val foo : ...
end

module Derived : DERIVED = struct
  include Base
  let foo = ...
end
Run Code Online (Sandbox Code Playgroud)

这是一个简单的结构包含.它不是OOP意义上的"(实现)继承",因为没有涉及后期绑定(开放递归).如果定义的值fDerived先前定义的Base,它会屏蔽之前的f,但打电话给f来自Base仍将使用旧的价值,而不是新的实现.

  • 谢谢你的回答......我的第二个问题:"是否可以改变`DERIVED`类型的名称:例如,它被称为''派生'而不是''基础`"? (2认同)