Наследование модулей в OCaml - PullRequest
2 голосов
/ 28 января 2012

Я уже определил интерфейс и модуль:

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 Ответ

5 голосов
/ 28 января 2012

Вы можете использовать include как для подписи, так и для реализаций.

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

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

Это простое включение структуры. Это не «наследование (реализация)» в смысле ООП, потому что нет необходимости в позднем связывании (открытой рекурсии). Если вы определите значение f в Derived, которое ранее было определено в Base, оно будет затенять предыдущее f, но при вызове f из Base будет использоваться старое значение, а не новое осуществление.

...