Verwendung von Funktoren als Schnittstellen in OCaml

8

Ich entwickle einige OCaml-Algorithmen, bei denen einige Teile "steckbar" sein müssen, damit ein Teil der Berechnung bestimmten Berechnern überlassen bleibt.

Um ein Beispiel zu geben, nehme ich an, dass ich eine Unterschrift wie diese habe:

%Vor%

Und zwei verschiedene Implementierungen, die Alg1 und Alg2 sein werden. Dieses Algorithm Modul sollte die Schnittstelle für verschiedene Implementierungen wie diese beiden darstellen.

Jetzt brauche ich eine andere Komponente, nennen wir es Executor , das das Modul sein wird, das Alg1 oder Alg2 über ihre Schnittstelle benutzt.

Wenn ich über Funktoren lese, brauche ich einen Funktor, der ein Algorithm benötigt und ein ConcreteExecutor mit einer bestimmten Implementierung des Algorithmus erzeugt, den ich brauche. Also ist Executor eine Art Modul, das über eine seiner Komponenten parametriert wird.

Habe ich Recht? Ist es der beste Weg, um das zu bekommen, was ich brauche? Ich frage mich, ob Thinkgs wie diese sind, weil ich von einem Java / C ++ - Hintergrund komme, also bin ich gewohnt, Interfaces und abstrakte Klassen zu verwenden, und ich muss in dieses Funktor / Modul-Abstraktionsproblem auf die richtige Weise eingehen.

Welches ist die richtige Syntax, um zu erhalten, was ich will?

Vielen Dank im Voraus

    
Jack 05.08.2010, 15:16
quelle

1 Antwort

4

Ja, es klingt wie Funktoren, was du willst. In der Tat können Sie sehen, wie die Standardbibliothek Funktoren verwendet, da der Quellcode verfügbar ist. Auf meinem Rechner befindet es sich unter /usr/lib/ocaml/3.10.2/. Als Beispiel enthält set.mli Folgendes:

%Vor%

Wenn Sie ein Set in OCaml verwenden möchten, tun Sie Folgendes:

%Vor%

Also ersetzt Algorithm mit seinem Code OrderedType, Alg1 / Alg2 ersetzt String, Executor ersetzt Make und ConcreteExecutor ist das Ergebnis von Executor (Alg1 / Alg2). Sie werden auch bemerken, dass string.mli / ml keine Erwähnung von OrderedType enthält. String ist ein OrderedType, da er einen Typ t hat, der von einem Funktionsvergleich verwendet wird. Sie müssen nicht explizit angeben, dass String ein OrderedType ist.

    
Niki Yoshiuchi 05.08.2010, 15:33
quelle

Tags und Links