Standard ML Funktor Beispiele

8

Funktoren in Standard-ML beziehen sich auf das Modulsystem und können Strukturen basierend auf anderen Strukturen erzeugen. Ein Beispiel für einen Funktor, der Listenkombinatoren für verschiedene Arten von Listen erzeugt, ist unten gegeben, aber dieses Beispiel hat ein Problem:

Die verschiedenen Arten von Listen haben alle Vorteile - zum Beispiel können faule Listen unendlich lang sein, und Concantenationslisten haben einen O (1) concat-Operator. Wenn jedoch alle diese Listentypen der gleichen Signatur entsprechen, kann der Funktor nur seine allgemeinen Eigenschaften verwenden.

Meine Frage lautet daher: Was ist ein gutes Beispiel dafür, wenn Funktoren nützlich sind und die verschiedenen generierten Strukturen ihre speziellen Fähigkeiten nicht verlieren?

%Vor%     
Simon Shine 24.10.2012, 13:07
quelle

3 Antworten

7

Ich bin mir nicht sicher, ob ich Ihre Frage vollständig verstanden habe. Offensichtlich sind Funktoren zum Definieren von modularen Abstraktionen nützlich, die (1) polymorph sind, (2) eine ganze Reihe von Operationen über ihre Typparameter erfordern und (3) Typen als Teil ihres Ergebnisses bereitstellen (insbesondere abstract <) / em> Typen) und (4) bieten eine ganze Reihe von Operationen.

Beachten Sie, dass Ihr Beispiel nicht (3) verwendet, was wahrscheinlich der interessanteste Aspekt von Funktoren ist. Stellen Sie sich zum Beispiel vor, Sie implementieren einen abstrakten Matrixtyp, den Sie über den zugrunde liegenden Vektortyp parametrisieren möchten.

Ein spezifisches Merkmal von ML-Funktoren - ebenso wie von Kernsprachen-polymorphen Funktionen - ist, dass sie parametrisch sind. Parametrik ist eine semantische Eigenschaft, die besagt, dass die Bewertung (des polymorphen Codes) den konkreten Typ (en), mit dem sie instanziiert wird, nicht beachtet. Das ist eine wichtige Eigenschaft, da sie alle Arten von semantischer Güte einschließt. Insbesondere bietet es sehr starke Abstraktions- und Schlussfolgerungsgrundsätze (siehe zB Wadlers "Theorem's for free! " oder die kurze Erklärung, die ich in auf eine andere Frage gegeben habe ). Es ist auch die Grundlage für das Löschen von Typen (d. H. Zur Laufzeit werden keine Typen benötigt).

Parametricity impliziert, dass ein einzelner Funktor nicht verschiedene Implementierungen für verschiedene Typen haben kann - was zu fragen scheint. Aber natürlich können Sie mehrere Funktoren schreiben, die unterschiedliche semantische / komplexe Annahmen über ihre Parameter treffen.

Hoffe, dass diese Art von Antwort Ihre Frage beantwortet.

    
Andreas Rossberg 10.11.2012, 08:51
quelle
3

Hier finden Sie einige nützliche Beispiele für SML-Funktoren. Sie werden unter der folgenden Prämisse gemacht: Wenn Sie eine Reihe von Dingen tun können, können Sie damit eine andere Sache machen.

Ein Funktor für Mengen: Wenn Sie Elemente vergleichen können, können Sie Mengen mithilfe ausgewogener Datenstrukturen (z. B. binäre Suchbäume oder andere Arten von Bäumen) erstellen.

%Vor%

Ein Funktor für die Iteration: Für jede Art von Sammlung von Dingen (z. B. Listen) können Sie sie automatisch falten, wenn Sie sie iterieren können. Sie können auch verschiedene Strukturen für verschiedene Möglichkeiten zum Falten über den gleichen Datentyp erstellen (z. B. Vorreihenfolge, Reihenfolge und Reihenfolge von Bäumen).

%Vor%     
Simon Shine 31.10.2013 14:26
quelle
2

Funktoren sind "Lifter" - sie heben (dieses Verb ist Standard-FP-Terminologie): Für eine gegebene Menge von Typen und Werten können Sie damit eine neue Menge von Typen und Werten erstellen Sie. Alle Module, die der geforderten Modulschnittstelle entsprechen, können zwar vom Funktor "profitieren", verlieren aber nicht ihre speziellen Fähigkeiten, wenn Sie unter Fähigkeiten die implementierungsspezifischen Vorteile verstehen.

Ihr Beispiel, zum Beispiel, funktioniert gut, um meinen Punkt zu demonstrieren: Verkettungslisten haben einen sehr schnellen Operator concat , wie Sie geschrieben haben, und wenn sie mit dem Funktor aufgehoben werden, verschwindet diese "Fähigkeit" nicht. Es ist immer noch da und vielleicht sogar von der Funktor-Code verwendet. In diesem Beispiel profitiert der Funktorcode tatsächlich von der Listenimplementierung, ohne ihn zu kennen. Das ist ein sehr starkes Konzept.

Da andererseits Module beim Anheben durch einen Funktor an eine Schnittstelle angepasst werden müssen, gehen dabei die überflüssigen Werte und Typen verloren, was lästig sein kann. Je nach ML-Dialekt kann diese Einschränkung jedoch etwas gelockert sein.

    
didierc 12.11.2012 01:18
quelle