2016-05-18 5 views
5

Ich möchte meine eigene Implementierung eines vorhandenen Moduls haben, aber eine kompatible Schnittstelle mit dem vorhandenen Modul zu halten. Ich habe keinen Modultyp für das vorhandene Modul, nur eine Schnittstelle. Also kann ich include Original_module nicht in meiner Schnittstelle verwenden. Gibt es eine Möglichkeit, einen Modultyp von einer Schnittstelle zu erhalten?Wie bekomme ich einen Modultyp von einer Schnittstelle?

Ein Beispiel könnte mit dem List Modul von der Stdlib sein. Ich erstelle ein My_list Modul mit genau der gleichen Signatur als List. Ich könnte list.mli zu my_list.mli kopieren, aber es scheint nicht sehr nett.

Antwort

5

In einigen Fällen sollten Sie

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

statt

include module type of M 

da letztere fällt die Gleichheiten von Datentypen mit ihrer origina ls definiert in M.

Der Unterschied kann durch ocamlc -i xxx.mli beachten:

include module type of struct include Complex end 

die folgende Typdefinition hat:

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

was bedeutet t ein Alias ​​des ursprünglichen Complex.t ist.

Auf der anderen Seite,

include module type of Complex 

hat

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

Ohne die Beziehung mit Complex.t wird es eine andere Art von Complex.t: Sie Code mit dem ursprünglichen Modul und Ihre erweiterte Version nicht mischen ohne den include Hack. Das ist normalerweise nicht das, was du willst.

+0

Können wir ein Modul 'my_m.ml' gegen eine vorhandene Interface-Datei' m.ml' implementieren, wenn es keine entsprechende Implementierung 'm.ml' gibt? – Yawar

2

Sie können RWO aussehen: Wenn Sie den Typ eines Moduls (wie List.mli) in einer anderen MLI-Datei aufnehmen möchten:

include (module type of List) 
Verwandte Themen