Funktionszusammensetzung ist eine Möglichkeit, zwei oder mehr Funktionen miteinander zu verketten. Es wird oft mit Rohrpaspel verglichen. Zum Beispiel in einem Unix-Shell-Stil, können Sie so etwas wie
cat foo.txt | sort -n | less
Dies läuft cat
, seine Ausgabe an sort
und führt die Ausgabe von der zu less
schreiben.
Genau dies ist wie der Haskell $
Operator. Sie könnten etwas wie
schreiben
sum $ sort $ filter (> 0) $ my_list
Beachten Sie, dass im Gegensatz zum Shell-Beispiel von rechts nach links liest. Also wir beginnen mit my_list
als Eingabe, dann laufen wir filter
darüber, dann wir sort
es, und dann berechnen wir die sum
davon.
Der Funktionszusammensetzungsoperator .
tut etwas ähnliches. Das obige Beispiel erzeugt eine Nummer; das folgende Beispiel erzeugt eine Funktion:
sum . sort . filter (> 0)
Beachten Sie, dass wir eigentlich nicht eine Liste in diesem Feed. Stattdessen haben wir eine neue Funktion erstellt und können dieser Funktion mehrere verschiedene Listen hinzufügen.Zum Beispiel könnten Sie diese Funktion nennen:
my_function = sum . sort . filter (> 0)
Oder Sie könnten es als Argument an eine andere Funktion übergeben:
map (sum . sort . filter (> 0)) my_lists
Sie können es im Grunde überall dort verwenden, dass Sie eine andere Art von Funktion nutzen zu können . Es ist nur eine schnelle und lesbare Art zu sagen: "Ich möchte diese Funktionen miteinander verketten".
Wie kommt es, dass Sie den Eingabeparameter in der Definition nicht anzeigen müssen? Zum Beispiel. Wieso schreibst du nicht 'myOdd x = nicht. sogar x'? – unclerojelio
@unclerojelio Es heißt punktfreier Stil. Anstatt "myOdd" in Bezug auf das Ergebnis für ein gegebenes Argument zu definieren ("Given' x', 'myOdd' gibt den gleichen Wert wie' (not. Even) x' "zurück), wird es in Bezug auf was es tatsächlich definiert is ("' myOdd' ist die Funktion, die entsteht, wenn 'not' aus' even' besteht). – chepner