如何在 OCaml 中进行函数覆盖?

How to do function override in OCaml?

我已经阅读了有关模块的整个章节book,但有些地方我不明白。

假设我有一个签名和该签名的实现:

module type X = sig
  val x : int
  val y : int
end

module X1 : X = struct
  let x = 5;
  let y = 6;
end

那么假设我有一个仿函数,它的参数是这个签名:

module IncX (M: X) = struct
  let x = M.x + 1
end

如果我想使用已经定义的 X1 模块实例化 IncX 但覆盖 y 函数怎么办?

我想做这样的事情:

module X1_Specialized : X = struct
  //how use x from X1 module here?
  let y = 10;
end

OOP 语言中的模拟是覆盖一个函数。

你要求的通常叫做实现继承。并且没有必要为此使用仿函数,只需 include:

module X1_Specialized : X = struct
  include X1
  let y = 10
end

include 将包含 X1 的全部内容,就好像您在 include 的位置写下了它的定义一样。这包括 y 的定义,但下面的 y 定义将隐藏它,并实质上取代它。

另请注意,OCaml 不使用分号作为语句终止符。这些是您的代码中的语法错误。