2013-03-07 3 views
11

Sto provando a creare un blocco do in modo interattivo in ghci. Finché io non definisco una variabile nel blocco, va bene:Come si usa un let all'interno di un blocco do in ghci?

Prelude>let a = do putStrLn "test"; putStrLn "other test" 
Prelude> 

ma non riesco a capire come definire una costruzione let nel blocco do in modo interattivo senza ottenere un errore di analisi:

Prelude> let a = do let b = 5; putStrLn $ show b 

<interactive>:2:40: 
    parse error (possibly incorrect indentation or mismatched brackets) 

Ovviamente

let a = do 
    let b = 5 
    putStrLn $ show b 

è del tutto bene in un file di origine Haskell. Sto solo avendo problemi a capire come tradurre quello in ghci.

risposta

15

Try questo:

let a = do let { b = 5 } ; print b 

Il blocco let può contenere dichiarazioni multiple così voi h per dire a GHCi quando hanno finito - ecco a cosa servono le parentesi in questa linea.

A proposito, è possibile utilizzare print per putStrLn . show.

1

avrei pensato che mettere in parentesi andrebbe bene, ma questo non analizza:

ghci> let a = do {let b = 5; putStrLn (show b)} 

si può sempre prendere l'approccio più righe, che funziona:

ghci> :{ 
ghci| let a = do let b = 5 
ghci|   putStrLn $ show b 
ghci| :} 
+1

': 1: 41: errore di parsing sull'ingresso '}' 'sempre –

+0

@ ДМИТРИЙМАЛИКОВ Sì, questo è ciò che riguarda la mia modifica ... –

+0

Ma non riesce ancora –

12
:help 

<statement>     evaluate/run <statement>  
:{\n ..lines.. \n:}\n  multiline command 

È possibile digitare : { per avviare un comando multilinea, e digitare :} per porvi fine.

Quindi basta fare

Prelude> :{ 
Prelude| let a = do 
Prelude|  let b=5 
Prelude|  putStrLn $ show b 
Prelude| 
Prelude| :} 

stare attenti con il layout (indentazione/spazi bianchi). Altrimenti puoi ottenere errori di analisi in codice apparentemente corretto.

Per esempio il seguente sarà NON lavoro perché il rientro non è abbastanza profonda:

Prelude> :{ 
Prelude| let a = do 
Prelude| let b=5 
Prelude| putStrLn $ show b 
Prelude| 
Prelude| :} 

Essa porterà ad un errore di analisi come questo:

<interactive>:50:4: parse error on input ‘let’ 
Problemi correlati