2016-05-18 11 views
5

Chciałbym mieć własną implementację istniejącego modułu, ale zachować kompatybilny interfejs z istniejącym modułem. Nie mam typu modułu dla istniejącego modułu, tylko interfejs. Więc nie mogę używać include Original_module w moim interfejsie. Czy istnieje sposób na pobranie typu modułu z interfejsu?Jak uzyskać typ modułu z interfejsu?

Przykład może pochodzić z modułu List ze stdlib. Tworzę moduł My_list z dokładnie tą samą sygnaturą niż List. Mogę skopiować list.mli do my_list.mli, ale to nie wydaje się bardzo miłe.

Odpowiedz

5

W niektórych przypadkach należy użyć

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

zamiast

include module type of M 

ponieważ te ostatnie krople do równości z typów danych z ich Origina Określono w M.

Różnicę można zaobserwować ocamlc -i xxx.mli:

include module type of struct include Complex end 

ma następującą definicję typ:

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

co oznacza t jest alias pierwotnego Complex.t.

Z drugiej strony,

include module type of Complex 

ma

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

Bez relacji z Complex.t, staje się inny typ od Complex.t: nie można mieszać kod za pomocą oryginalnego modułu i swoją rozszerzoną wersję bez hackowania include. Zazwyczaj nie tego chcesz.

+0

Czy możemy zaimplementować moduł 'my_m.ml' przeciwko istniejącemu plikowi interfejsu' m.mli', jeśli w ogóle nie ma odpowiadającej mu implementacji 'm.ml'? – Yawar

2

Możesz zajrzeć RWO: jeśli chcesz to typ modułu (jak List.mli) w innym pliku MLI:

include (module type of List) 
Powiązane problemy