Как сделать переопределение функции в OCaml? - PullRequest
1 голос
/ 26 апреля 2020

Я прочитал всю главу о модулях в этой книге , но кое-что я не понял.

Предположим, у меня есть подпись и реализация этой подписи:

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

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

Тогда предположим, что у меня есть функтор с такой сигнатурой в качестве paremeter:

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

Что если я хочу создать экземпляр IncX с использованием уже определенного модуля X1, но переопределить y функция?

Я хочу сделать что-то вроде этого:

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

Аналогом в OOP языках будет переопределение функции.

1 Ответ

3 голосов
/ 26 апреля 2020

То, что вы просите, обычно называется наследованием реализации. И для этого не обязательно использовать функтор, просто include :

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

include будет включать все содержимое X1, как если бы вы написали его определение в место include. Это включает в себя определение y, но следующее определение y будет его затенять и, по существу, заменить.

Также обратите внимание, что OCaml не использует точку с запятой в качестве терминатора оператора. Это синтаксические ошибки в вашем коде.

...