2016-05-18 19 views
5

Mi piacerebbe avere la mia implementazione di un modulo esistente ma mantenere un'interfaccia compatibile con il modulo esistente. Non ho un tipo di modulo per il modulo esistente, solo un'interfaccia. Quindi non posso usare include Original_module nella mia interfaccia. C'è un modo per ottenere un tipo di modulo da un'interfaccia?Come ottenere un tipo di modulo da un'interfaccia?

Un esempio potrebbe essere con il modulo List dallo stdlib. Creo un modulo My_list con esattamente la stessa firma di List. Potrei copiare list.mli a my_list.mli, ma non sembra molto bello.

risposta

5

In alcuni casi, è necessario utilizzare

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

anziché

include module type of M 

quanto quest'ultimo scende le uguaglianze di tipi di dati con il loro origina Definito in M.

La differenza può essere osservato ocamlc -i xxx.mli:

include module type of struct include Complex end 

ha la seguente definizione tipo:

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

che significa t è un alias dell'originale Complex.t.

D'altra parte,

include module type of Complex 

ha

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

Senza il rapporto con Complex.t, diventa un tipo diverso da Complex.t: non è possibile mescolare il codice utilizzando il modulo originale e la versione estesa senza l'hack include. Questo non è quello che vuoi di solito.

+0

È possibile implementare un modulo 'my_m.ml' rispetto a un file di interfaccia esistente' m.mli' se non esiste un'implementazione corrispondente 'm.ml' in primo luogo? – Yawar

2

Potete guardare RWO: se si desidera includere il tipo di un modulo (come List.mli) in un altro file MLI:

include (module type of List)