Haskell: Warum ist ((.). (.)) f g gleich f. g x?

8

Könnten Sie bitte die Bedeutung des Ausdrucks ((.). (.)) erklären? Soweit ich weiß (.) Hat der Typ (b - & gt; c) - & gt; (a - & gt; b) - & gt; a - & gt; c.

    
user2043097 05.02.2013, 12:36
quelle

2 Antworten

22

(.) . (.) ist die Zusammensetzung des Kompositionsoperators mit sich selbst.

Wenn wir uns

ansehen %Vor%

können wir das ein paar Schritte auswerten, zuerst wir Klammern,

%Vor%

Dann wenden wir an und verwenden (foo . bar) arg = foo (bar arg) :

%Vor%

Mehr prinzipielle,

%Vor%

Also, indem wir (.) als erstes Argument von (.) verwenden, müssen wir

vereinheitlichen %Vor%

mit

%Vor%

Das ergibt

%Vor%

und

%Vor%

Um dies auf (.) anzuwenden, müssen wir nun den Typ

vereinheitlichen %Vor%

mit dem Typ von (.) , nach dem Umbenennen

%Vor%

was zu

führt %Vor%

und somit

%Vor%

und vom Typ können wir (fast) lesen, dass (.) . (.) eine Funktion (von einem Argument) auf das Ergebnis einer Funktion von zwei Argumenten anwendet.

    
Daniel Fischer 05.02.2013 12:48
quelle
2

Sie haben bereits eine Antwort, hier ist ein etwas anderer Ansatz.

In kombinatorische Logik (.) ist B -kombinator : Babc = a(bc) . Wenn Kombinatorausdrücke geschrieben werden, ist es üblich anzunehmen, dass jeder Bezeichner nur aus einem Buchstaben besteht und Leerraum in der Anwendung auslässt, um die Ausdrücke lesbarer zu machen. Natürlich gilt das übliche currying: abcde ist (((ab)c)d)e und umgekehrt.

(.) ist B , also ((.) . (.)) == (.) (.) (.) == BBB . Also,

%Vor%

Wir können beide y s am Ende wegwerfen (dies wird als eta-reduction bezeichnet : Gy=Hy - & gt; G=H , wenn y nicht in H 1 erscheint. Aber auch, eine andere Möglichkeit, dies zu präsentieren, ist

%Vor%

((f .) . g) x y ist möglicherweise einfacher einzutippen als ((.).(.)) f g x y , aber YMMV.

1 Zum Beispiel mit S Kombinator , definiert als Sfgx = fx(gx) , ohne Rücksicht auf diese Regel könnten wir

schreiben %Vor%

was Unsinn ist.

    
Will Ness 06.02.2013 10:45
quelle