Betrachten Sie die folgenden Haskell Definitionen, genommen von this excellent Haskell video on YouTube:Wie Schwedisch ist eine sehr sehr schwedische Begrüßung?
import Data.List
greeting = "Hello"
swedish = intersperse 'f'
very f x = f (f (f x))
Wenn wir sie in GHCi laden, sehen wir folgende Ergebnisse:
ghci> swedish greeting
"Hfeflflfo"
ghci> very swedish greeting
"Hfffffffeffffffflffffffflfffffffo"
ghci> very very swedish greeting
"Hffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
fffffffffffffffffffffffffffff... (536,870,913 chars total)
Die ersten beiden Ausgänge I perfekt verstehen. Eine swedish greeting
kommt mit f
s durcheinander, und eine very swedish greeting
ist nur eine , die dreifach durchsetzt.
Aber was genau passiert in der dritten Eingabezeile? Mein (ziemlich unvollständiges) Verständnis der Haskell-Syntax besagt, dass eine durch Leerzeichen getrennte Sequenz von Ausdrücken als Funktionsaufruf interpretiert wird, wobei der erste Ausdruck die Funktion und der Rest die Argumente sind. Wie wird in diesem Fall das äußerste very
mit drei Argumenten (very
, swedish
und greeting
) aufgerufen, wenn es nur definiert ist, um zwei zu akzeptieren? Wenn es hilft, scheint es, dass ein very very swedish greeting
einem swedish $ swedish $ swedish $ swedish $ ... (27 layers of swedish) ... $ swedish $ swedish greeting
entspricht.
moderne schweden begrüßen "Hallo"! – epsilonhalbe