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
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.