Mit den „drei Regeln der Operator Abschnitte“, wie angewandt die Zusammensetzung Operator (.)
Funktion,
(.) f g = (f . g) = (f .) g = (. g) f -- the argument goes into the free slot
-- 1 2 3
dies ableitbar ist durch ein paar einfachen mechanischen Schritte:
k x y = (f (g x)) (h y) -- a (b c) === (a . b) c
= (f (g x) . h) y
= (. h) (f (g x)) y
= (. h) ((f . g) x) y
= ((. h) . (f . g)) x y
Schließlich ist (.)
assoziativ, so dass die inneren Parens fallengelassen werden können.
Das allgemeine Verfahren ist bestrebt, die Situation zu erreichen, in der eta-Reduktion durchgeführt werden kann, dh wir können die Argumente loswerden, wenn sie in derselben Reihenfolge und sind außerhalb jegliche Klammern sind:
k x y = (......) y
=>
k x = (......)
Lather , rinse, wiederholen.
Ein weiterer Trick ist zwei Argumente in eine oder umgekehrt zu drehen, mit der Gleichung
curry f x y = f (x,y)
so, Ihre
f (g x) (h y) = (f.g) x (h y) -- by B-combinator rule
= (f.g.fst) (x,y) ((h.snd) (x,y))
= (f.g.fst <*> h.snd) (x,y) -- by S-combinator rule
= curry (f.g.fst <*> h.snd) x y
Dies ist das gleiche wie die answer by @chepner ist, aber Prägnanter präsentiert.
So sehen Sie, Ihre (f.g <*> h) x
wird nur (f.g.fst <*> h.snd) (x,y)
. Gleicher Unterschied.
(weil für Funktionen, (<$>) = (.)
)
) sein Das ist sehr verschieden von dem Verfahren, das ich selbst befolge. Es ist immer erfrischend, ein neues zu sehen Weg. – dfeuer