2011-12-09 14 views
94

Ho riscontrato problemi nell'immissione di comandi multilinea in ghci. Il seguente codice di 2 righe lavora da un file:Comandi multilinea in GHCi

addTwo :: Int -> Int -> Int 
addTwo x y = x + y 

Ma quando entro in ghci, ottengo errori. Ho anche provato a inserire il codice all'interno di :{ ... :}, ma non funzionano anche per questo esempio, perché questo è solo aggiungendo le linee in un'unica riga, il che non dovrebbe essere il caso.

Sto usando WinGHCi, versione 2011.2.0.1

+2

possibile duplicato di [Come definire una funzione in ghci su più righe?] (Http://stackoverflow.com/questions/2846050/how-to-define-a-function-in-ghci-across-multiple- linee) – devnull

risposta

125

maggior parte del tempo, si può contare su di inferenza di elaborare una firma per voi. Nel tuo esempio, il seguente è sufficiente:

Prelude> let addTwo x y = x + y 

Se si vuole veramente una definizione con una firma tipo, o la tua definizione si estende su più righe, si può fare questo in ghci:

Prelude> :{ 
Prelude| let addTwo :: Int -> Int -> Int 
Prelude|  addTwo x y = x + y 
Prelude| :} 
Prelude> addTwo 4 7 
11 

Nota che si può anche spremere questo in una sola riga:

Prelude> let addTwo :: Int -> Int -> Int ; addTwo x y = x + y 

È possibile trovare maggiori informazioni su interagire con ghci sulla sezione Interactive evaluation at the prompt della documentazione.

+1

Grazie mille per entrambe le soluzioni. Ma ho un'altra domanda correlata: perché i quattro grezzi iniziali richiesti nella seconda riga (prima di addTwo)? E questo deve essere esatto, se ci sono meno o più spazi vuoti, allora c'è un errore. – R71

+7

@Rog 'let' inizia un blocco; le voci in un blocco sono raggruppate per rientro; e il primo carattere non di spazi vuoti in un blocco imposta il rientro in base al quale sono raggruppati. Dal momento che il primo carattere non di spaziatura nel blocco 'let' sopra è il' a' di 'addTwo', tutte le linee nel blocco devono essere rientrate esattamente profonde quanto' a'. –

+0

Grazie. Ho anche notato che in altri blocchi let/where.Questa è una grande differenza dalle altre lingue in cui gli spazi vengono ignorati, quindi ho avuto qualche difficoltà a coglierlo. – R71

11

Uso let:

Prelude> :{ 
Prelude| let addTwo :: Int -> Int -> Int 
Prelude|  addTwo x y = x + y 
Prelude| :} 
Prelude> addTwo 2 3 
5 
73

risolvere questo problema cottura fino GHCI e digitando :set +m:

Prelude> :set +m 
Prelude> let addTwo :: Int -> Int -> Int 
Prelude|  addTwo x y = x + y 
Prelude| 
Prelude> addTwo 1 3 
4 

Boom.


Che cosa sta succedendo qui (e sto parlando soprattutto per si, persona googling per chiedere aiuto mentre si lavora il vostro senso attraverso Learn You A Haskell) è che GHCI è un ambiente interattivo in cui stai cambiando attacchi di nomi di funzione al volo. Devi racchiudere le definizioni delle tue funzioni in un blocco let, in modo che Haskell sappia che stai per definire qualcosa. Il materiale :set +m è una scorciatoia per il costrutto multilinea codice:}.

Lo spazio bianco è anche significativo nei blocchi, quindi è necessario indentare la definizione della funzione dopo la definizione del tipo di quattro spazi per tenere conto dei quattro spazi in let.

+3

Così semplice, ma non ovvio. Volevo urlare al libro che stavo usando per non dirmelo a pagina 1! – Tim