7

Oft finde ich, dass ich zwei Funktionen f und g zusammensetzen möchte, aber g benötigt mehrere Argumente. Bietet Haskell eine Reihe von Operatoren, dass (ich weiß, dass ich es selbst schreiben konnte, aber es scheint ziemlich häufig und ich möchte keinen Operator duplizieren, die bereits in Haskell existiert)Haskell-Notation für das Zusammensetzen zweier Funktionen f und g wobei g mehrere Argumente benötigt

also so etwas wie

([email protected]) = (.) 
([email protected]@) f g x1 x2 = f $ g x1 x2 
([email protected]@@) f g x1 x2 x3 = f $ g x1 x2 x3 
([email protected]@@@) f g x1 x2 x3 x4 = f $ g x1 x2 x3 x4 
... 

bis zu einer vernünftigen Anzahl von Argumenten

+3

Sie könnten sich für die [Zusammensetzung] (http://hackage.haskell.org/package/composition-1.0.1.0/docs/Data-Composition.html) Bibliothek interessieren – bheklilr

+0

Könnten Sie bitte ein konkretes Beispiel geben? – Shoe

+1

@bheklilr Danke, das ist die Antwort, nach der ich gesucht habe. Es ist (. :) (.: :) usw. Ich habe versucht zu googeln "Haskell komponieren Funktion mehrere Argumente", aber Google hat keine nützlichen Links geben – dspyz

Antwort

6

dachte ich weiß, Sie die Antwort bekam man wollte, aber ich wollte, dass diese combinators darauf hinzuweisen, haben die folgende nette Umsetzung:

(.:) = (.) . (.) 
(.:.) = (.) . (.) . (.) 
(.::) = (.) . (.) . (.) . (.) 
(.::.) = (.) . (.) . (.) . (.) . (.) 

und wenn Sie brauchen, um sie in vollem Umfang angewendet:

f .: g = (f .) . g 
f .:. g = ((f .) .) . g 
f .:: g = (((f .) .) .) . g 
f .::. g = ((((f .) .) .) .) . g 

Es scheint nicht so schrecklich, diese Ausdrücke direkt zu verwenden, ohne einen Operator zu definieren. Zumindest die erste, (f .) . g, scheint mir lesbar genug zu sein.

+1

Wow! Ich liebe das, aber ich bin total verloren. Würde es dir etwas ausmachen, das in kleinen Schritten zu erklären? Ich kann nicht herausfinden, wie man es auspackt. – dspyz

+0

Okay, ich habe es herausgefunden, nachdem ich alles in die Präfixschreibweise verschoben und (.) (.) (.) Evaluiert habe, indem ich einfach (.) F g x Ausdrücke mit f (g x) ersetzt habe, bis ich bei f (g x y) angekommen bin. – dspyz