Ich habe kürzlich die Data.Promotion
Hälfte von Singletons entdeckt. Es hat viele Typenfamilien, die im wesentlichen willkürliche Berechnungen auf der Typ-Ebene erlauben. Ich habe ein paar Fragen zur Verwendung:
Was ist der Unterschied zwischen ? ($)
, (%$)
($$)
, und hängen sie mit :++$
, :.$
usw. zusammen? Sind das tatsächlich Infix-Operatoren? Ich war unter der Impression mussten alle Infix-Konstruktoren mit :
beginnen.
Ich versuche, einen Konstruktor über eine Liste abzubilden:
%Vor%, aber ich habe Probleme bei der Verwendung eines Konstruktors mit mehreren Parametern. Ideen?
Ich konnte alle Typ-Funktionen, die ich geschrieben habe, durch äquivalente Funktionen von Data.Promotion
ersetzen, außer diesem:
Gibt es irgendeine Art von Magie mit der Constraint
Art, die ihre Manipulation als verschachtelte Paare verhindert?
Wie in den Kommentaren erläutert wurde, gibt es für syntaktische Anforderungen an Infix-Funktionen auf der Typ-Ebene nicht mehr, mit einem Doppelpunkt zu beginnen. Also ja, all das sind Infix-Operatoren. Keine zwei Infix-Operatoren sind automatisch miteinander verwandt, aber die Singleton-Bibliothek verwendet interne Benennungskonventionen, um Symbole, die für Defunktionalisierung (siehe unten) verwendet werden, mit ihren normalen Gegenstücken in Beziehung zu setzen.
Es gibt eine ganze Reihe von Problemen, die dadurch entstehen, dass Typfamilien nicht teilweise angewendet werden können, aber Datentypen. Aus diesem Grund verwendet die Singletons-Bibliothek eine Technik namens defunktionalization : Für jede partiell angelegte Typ-Funktion definiert sie einen Datentyp. Dann gibt es eine (sehr große und offene) Familie namens Apply
, die alle diese Datentypen übernimmt, die teilweise angewandte Funktionen und geeignete Argumente darstellen und die eigentliche Anwendung ausführen.
Die Art solcher defunktionalisierten Repräsentationen von Typfunktionen ist
%Vor%aus verschiedenen Gründen (übrigens, eine gute Einführung zu all dem gibt es in Richard Eisenbergs Blogpost " Defunktionalisierung für den Gewinn "), während die Art der entsprechenden" normalen "Typ-Funktion
wäre %Vor% Nun erwarten alle Funktionen höherer Ordnung in Singletons defunktionalisierte Argumente. Zum Beispiel ist die Art von Map
und nicht
%Vor%Sehen wir uns nun die Funktionen an, mit denen Sie arbeiten:
%Vor% Das erste Argument ist eine defunktionalisierte Curry-Funktion vom Typ k -> k1 -> k2
und macht daraus eine normale Typ-Funktion vom Typ k1 -> k -> k2
.
Auch:
%Vor% Dies ist nur ein Synonym für das oben erwähnte Apply
.
Sehen wir uns nun Ihr Beispiel an:
%Vor% Hier gibt es zwei Probleme: Erstens ist Foo
ein Datentyp und kein defunktionalisiertes Symbol, da Flip
erwartet. Zweitens ist Flip
eine Typfamilie und erwartet drei Argumente, von denen jedoch nur eines zur Verfügung steht. Wir können das erste Problem beheben, indem wir TyCon2
anwenden, das einen normalen Datentyp annimmt und es in ein defunktionalisiertes Symbol verwandelt:
Für das zweite Problem benötigen wir eine der Teilanwendungen von Flip
, die Singletons bereits für uns definieren:
Wenn Sie genau hinschauen, ist FlipSymN
die erforderliche Repräsentation, wenn Flip
teilweise auf N
Argumente angewendet wird und Flip
der imaginären FlipSym3
entspricht. Im Beispiel wird Flip
auf ein Argument angewendet, sodass das korrigierte Beispiel zu
Und das funktioniert:
%Vor%Das zweite Beispiel ist ähnlich:
%Vor% Hier haben wir die folgenden Probleme: Auch hier muss Foo
in ein defunktionalisiertes Symbol umgewandelt werden mit TyCon2
; Operatorabschnitte wie $ b
sind auf Typebene nicht verfügbar, daher der Parse-Fehler. Wir müssen Flip
erneut verwenden, aber dieses Mal FlipSym2
, weil wir es auf den Operator $
und b
anwenden. Oh, aber dann wird $
teilweise angewendet, also brauchen wir ein Symbol, das $
mit 0 Argumenten entspricht. Dies ist als $$
in Singletons verfügbar (für symbolische Operatoren haben die defunktionalisierten Symbole $
s angehängt). Und schließlich wird auch :.
teilweise angewendet: Es erwartet drei Operatoren, aber nur zwei. Also gehen wir von :.
zu :.$$$
(drei Dollar, weil ein Dollar 0
entspricht, und drei Dollar entsprechen 2
). Alles in allem:
Und noch einmal, das funktioniert:
%Vor% Ich bin vielleicht blind, aber ich glaube nicht, dass dies in Singletons enthalten ist, was sich nicht so sehr um Constraint
s dreht. Es ist jedoch eine nützliche Funktion. Es befindet sich in einer Bibliothek, an der ich gerade arbeite . Es ist immer noch unvollendet und größtenteils undokumentiert, deshalb habe ich es noch nicht veröffentlicht.
Tags und Links haskell ghc type-promotion