OCaml中模块的继承

时间:2012-01-28 00:22:33

标签: inheritance module ocaml

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

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

module base =
  (struct
    type 'a base
    let ...
    ...
  end: BASE) 

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

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

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

1 个答案:

答案 0 :(得分:5)

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

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

module Derived : DERIVED = struct
  include Base
  let foo = ...
end

这是一个简单的结构包含。它不是OOP意义上的“(实现)继承”,因为没有涉及后期绑定(开放递归)。如果您在f中定义之前在Derived中定义的值Base,则会影响之前的f,但会从{{1}调用f仍将使用旧值,而不是新实现。