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.
(.) . (.)
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)
:
Mehr prinzipielle,
%Vor% Also, indem wir (.)
als erstes Argument von (.)
verwenden, müssen wir
mit
%Vor%Das ergibt
%Vor%und
%Vor% Um dies auf (.)
anzuwenden, müssen wir nun den Typ
mit dem Typ von (.)
, nach dem Umbenennen
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.
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,
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
((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
was Unsinn ist.
Tags und Links haskell types combinators pointfree function-composition