2016-05-18 2 views
5

Я хотел бы иметь собственную реализацию существующего модуля, но поддерживать совместимый интерфейс с существующим модулем. У меня нет типа модуля для существующего модуля, только интерфейс. Поэтому я не могу использовать include Original_module в моем интерфейсе. Есть ли способ получить тип модуля из интерфейса?Как получить тип модуля из интерфейса?

Примером может служить модуль List от stdlib. Я создаю модуль My_list с точно такой же подписью, что и List. Я мог бы скопировать list.mli на my_list.mli, но это не выглядит очень приятным.

ответ

5

В некоторых случаях, вы должны использовать

include module type of struct include M end (* I call it OCaml keyword mantra *) 

, а не

include module type of M 

поскольку последние капли равенств типов данных с их Origina ls определено в M.

Различие можно наблюдать ocamlc -i xxx.mli:

include module type of struct include Complex end 

имеет следующее определение типа:

type t = Complex.t = { re : float; im : float; } 

что означает t является псевдонимом оригинального Complex.t.

С другой стороны,

include module type of Complex 

имеет

type t = { re : float; im : float; } 

Без связи с Complex.t, она становится другой тип от Complex.t: вы не можете смешивать код, используя оригинальный модуль и расширенную версию без include взломать. Обычно это не то, что вы хотите.

+0

Можем ли мы реализовать модуль 'my_m.ml' в отношении существующего файла интерфейса' m.mli', если в первую очередь не существует соответствующей реализации 'm.ml'? – Yawar

2

Вы можете посмотреть на RWO: если вы хотите, чтобы включить тип модуля (например, List.mli) в другом файле МСИ:

include (module type of List) 
Смежные вопросы