2013-09-27 6 views
8

questo codice funziona ovviamenteNon usando una variabile per <-

import Data.Char 

main = do 
    content <- readFile "in.txt" 
    writeFile "out.txt" (map toUpper content) 

Perché questo non lo fa?

import Data.Char 

main = do 
    writeFile "out.txt" (map toUpper $ <- readFile "in.txt") 

risposta

17

Perché questo non è il modo in <- è definito. Essa si traduce in

readFile "in.txt" >>= \content -> 
writeFile "out.txt" (map toUpper content) 

Potreste usare =<< invece:

writeFile "out.txt" . map toUpper =<< readFile "in.txt" 
3

possibile per scrivere come segue

readFile "in.txt" >>= writeFile "out.txt" . map toUpper 
+0

Oppure 'map toUpper <$> readFile" in.txt ">> = writeFile" out.txt "'. Comunque penso che l'OP volesse una spiegazione e non una semplice soluzione – nponeccop

17

In primo luogo, <- non è un operatore. Si tratta di uno speciale elemento di sintassi che richiede un modello sul lato sinistro.

In secondo luogo, se si trattasse di un operatore infisso, $ <- non funzionerebbe, in quanto non è possibile avere due operatori di infissi uno accanto all'altro.

6

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.

Problemi correlati