Il <-
"estrae" un valore da un contenitore monadico. IO
è una monade e quindi può essere utilizzato per estrarre un valore da un'azione IO
. Tuttavia, la sintassi di Haskell dice che è necessario associarlo a un nome prima di utilizzarlo. In realtà, lo <-
non è affatto un operatore, ma lo zucchero sintattico per l'operatore >>=
(pronunciato "bind"). Così, quando si scrive
main = do
contents <- readFile "in.txt"
writeFile "out.txt" (map toUpper contents)
Esso viene trasformato in
main = readFile "in.txt" >>= (\contents -> writeFile "out.txt" (map toUpper contents))
Ora, immaginate se si ha molto più istruzioni in main
. Forse hai estratto diversi valori con <-
e alcune espressioni hanno utilizzato più di uno di questi valori alla volta. Potresti sicuramente scrivere la versione "desugared", ma inizierebbe a diventare molto, molto difficile. La notazione lo semplifica e fa in modo che il compilatore si prenda cura di te per te.
Oppure 'map toUpper <$> readFile" in.txt ">> = writeFile" out.txt "'. Comunque penso che l'OP volesse una spiegazione e non una semplice soluzione – nponeccop