Ich versuche, das folgende Stück Code zu verstehen:Warum funktioniert diese Funktion, obwohl das Argument fehlt?
import Data.Char (ord)
encodeInteger :: String -> Integer
encodeInteger = read . concatMap ch
where ch c = show (ord c)
Aber ich sehe nicht, wie das funktionieren kann, wenn encodeInteger
als eine Funktion definiert, die eine Zeichenfolge annimmt, aber in der zweiten Zeile, das Funktion wird ohne dieses String-Argument implementiert.
Auch, concatMap
(nach Hoogle), nimmt eine Funktion und eine Liste, aber nur die Funktion ch
wird zur Verfügung gestellt.
Warum funktioniert dieser Code noch? Ist das Argument irgendwie magisch passiert? Hat es etwas mit Curry zu tun?
edit: Und warum es nicht, es so zu ändern, arbeiten:
encodeInteger :: String -> Integer
encodeInteger a = read . concatMap ch a
where ch c = show (ord c)
Eine Funktion "a -> b -> c" in Haskell bedeutet eine Funktion "a -> (b -> c)", d.h. wenn sie auf ein "a" angewendet wird, erzeugt sie ein "b -> c". 'f a b' ist ebenfalls nur '(f a) b'. Da 'concatMap' (vereinfacht)' (a -> [b]) -> [a] -> [b] 'ist, ist' concatMap ch' eine a-Funktion '[a] -> [b]'. – Ryan
Hallo, danke, das macht irgendwie alles Sinn. Aber sollte ich nicht in der Lage sein zu tun, was ich unter Bearbeiten hinzugefügt habe? – user66875
@ user66875 Sie müssen die gesamte Zusammensetzung auf das Argument anwenden. Im Moment erwartet man, dass 'concatMap ch a 'eine Funktion ist (das zweite Argument von' .'). Verwenden Sie 'lesen. concatMap ch $ a' – Lazersmoke