Syntax für die Datenweitergabe

8

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:

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

  2. Ich versuche, einen Konstruktor über eine Liste abzubilden:

    %Vor%

    , aber ich habe Probleme bei der Verwendung eines Konstruktors mit mehreren Parametern. Ideen?

  3. Ich konnte alle Typ-Funktionen, die ich geschrieben habe, durch äquivalente Funktionen von Data.Promotion ersetzen, außer diesem:

    %Vor%

    Gibt es irgendeine Art von Magie mit der Constraint Art, die ihre Manipulation als verschachtelte Paare verhindert?

crockeea 04.06.2014, 22:24
quelle

1 Antwort

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

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

    %Vor%

    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:

    %Vor%

    Für das zweite Problem benötigen wir eine der Teilanwendungen von Flip , die Singletons bereits für uns definieren:

    %Vor%

    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

    wird %Vor%

    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:

    %Vor%

    Und noch einmal, das funktioniert:

    %Vor%
  3. 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.

kosmikus 05.06.2014, 06:44
quelle

Tags und Links