Betrachten Sie die folgende Funktionsdefinition in ghci.
let myF = sin . cos . sum
wobei . für die Komposition von zwei Funktionen steht (rechts-assoziativ). Dies kann ich nennen
myF [3.14, 3.14]
und ich erhalte das gewünschte Ergebnis. Offensichtlich wird die Liste [3.14, 3.14] an die Funktion 'sum' übergeben und deren 'Ergebnis' an cos und so weiter und so fort. Wenn ich dies jedoch im Interpreter mache
let myF y = sin . cos . sum y
o
let myF y = sin . cos (sum y)
dann stoße ich auf Probleme. Wenn ich dies wie folgt ändere, erhalte ich das gewünschte Ergebnis.
let myF y = sin . cos $ sum y
o
let myF y = sin . cos . sum $ y
Der Typ von (.) legt nahe, dass es kein Problem mit der folgenden Form geben sollte, da 'sum y' auch eine Funktion ist (nicht wahr? Schließlich ist in Haskell alles eine Funktion?)
let myF y = sin . cos . sum y -- this should work?
Was noch interessanter ist, ist die Tatsache, dass ich es mit zwei (oder vielen) Argumenten zum Laufen bringen kann (denken Sie an die Übergabe der Liste [3.14, 3.14] als zwei Argumente x und y), ich muss folgendes schreiben
let (myF x) y = (sin . cos . (+ x)) y
myF 3.14 3.14 -- it works!
let myF = sin . cos . (+)
myF 3.14 3.14 -- -- Doesn't work!
Es gibt eine Diskussion auf HaskellWiki über diese Form, die sie 'PointFree' Form nennen http://www.haskell.org/haskellwiki/Pointfree . Wenn ich diesen Artikel lese, vermute ich, dass sich diese Form von der Komposition zweier Lambda-Ausdrücke unterscheidet. Ich bin verwirrt, wenn ich versuche, eine Trennlinie zwischen diesen beiden Formen zu ziehen.