Die <-
"extrahiert" einen Wert aus einem monadischen Container. IO
ist eine Monade und kann daher zum Extrahieren eines Werts aus einer IO
Aktion verwendet werden. Die Syntax von Haskell besagt jedoch, dass Sie binden müssen, bevor Sie es verwenden. Tatsächlich ist die kein Operator, sondern syntaktischer Zucker für den Operator >>=
(ausgesprochen "bind"). Also, wenn Sie
schreiben
main = do
contents <- readFile "in.txt"
writeFile "out.txt" (map toUpper contents)
Es wird verwandelte sich in
main = readFile "in.txt" >>= (\contents -> writeFile "out.txt" (map toUpper contents))
Nun, wenn Sie sich vorstellen in main
viel mehr Aussagen hatte. Vielleicht haben Sie mehrere Werte mit <-
extrahiert, und einige Ausdrücke haben mehr als einen dieser Werte gleichzeitig verwendet. Man könnte definitiv die "entzuckerte" Version schreiben, aber es würde sehr, sehr schwierig werden. Die Do-Notation vereinfacht dies und sorgt dafür, dass der Compiler sich darum kümmert.
Oder 'map toUpper <$> readFile" in.txt ">> = Schreibdatei" out.txt "'. Ich denke jedoch, dass das OP eine Erklärung und keine bloße Lösung wollte – nponeccop