Ich habe Probleme zu verstehen, wie diese Haskell Ausdruck funktioniert:Bitte erläutern (Form_ [stdout, stderr] Flip hPutStrLn.) :: String -> IO()
import Control.Monad
import System.IO
(forM_ [stdout, stderr] . flip hPutStrLn) "hello world"
Was das genau tun . flip hPutStrLn
Teil ist ? Die Art Signaturen kompliziert erscheinen:
ghci> :type flip
flip :: (a -> b -> c) -> b -> a -> c
ghci> :type (.)
(.) :: (b -> c) -> (a -> b) -> a -> c
ghci> :type (. flip)
(. flip) :: ((b -> a -> c1) -> c) -> (a -> b -> c1) -> c
ghci> :type (. flip hPutStrLn)
(. flip hPutStrLn) :: ((Handle -> IO()) -> c) -> String -> c
Was sind die linken und rechten Operanden des (.)
Operator als Ausdruck wird ausgewertet?
Eine andere Möglichkeit, meine Frage zu stellen ist, wie funktioniert der linke Teil des Ausdrucks am oberen Ende oben mit einer Art Signatur wie folgt aus:
(forM_ [stdout, stderr] . flip hPutStrLn) :: String -> IO()
vergleicht ': Typ (. HPutStrLn)' mit ': Typ (. Flip hPutStrLn)' Hilfe überhaupt? –
Wer würde solchen Code schreiben? Der Punkt-freie Stil ist hier wirklich sinnlos und schmerzt Lesbarkeit, IMHO –
@ NiklasB. Es ist nicht schlecht für mich, obwohl ich mich an eine Zeit in der Vergangenheit erinnere, als es völlig undurchsichtig gewesen wäre. Es hängt von deiner Vertrautheit mit dem Stil ab, denke ich (oder vielmehr, offensichtlich). – luqui