via - osx install haskell




Come definire una funzione in ghci su più righe? (4)

Sto cercando di definire qualsiasi funzione semplice che si estende su più righe in ghci, prendi come esempio:

let abs n | n >= 0 = n
          | otherwise = -n

Finora ho provato a premere Invio dopo la prima riga:

Prelude> let abs n | n >= 0 = n
Prelude>           | otherwise = -n
<interactive>:1:0: parse error on input `|'

Ho anche provato a usare i comandi :{ e :} ma non mi allontano:

Prelude> :{
unknown command ':{'
use :? for help.

Sto usando GHC Interactive versione 6.6 per Haskell 98 su Linux, cosa mi manca?


Dan è corretto, ma :{ e :} devono apparire ciascuno sulla propria riga:

> :{ 
> let foo a b = a +
>           b
> :}
> :t foo
foo :: (Num a) => a -> a -> a

Questo interagisce anche con la regola di layout, quindi quando si usa la notazione, potrebbe essere più facile usare le parentesi e i punti e virgola in modo esplicito. Ad esempio, questa definizione ha esito negativo:

> :{
| let prRev = do
|   inp <- getLine
|   putStrLn $ reverse inp
| :}
<interactive>:1:18:
    The last statement in a 'do' construct must be an expression

Ma funziona quando vengono aggiunti parentesi graffe e punti e virgola:

> :{
| let prRev = do {
|   inp <- getLine;
|   putStrLn $ reverse inp;
| }
| :}
> :t prRev
prRev :: IO ()

Ciò avrà davvero importanza quando si incollano le definizioni da un file, dove il rientro potrebbe cambiare.


GHCi ora ha una modalità di input multilinea, abilitata con: set + m. Per esempio,

Prelude> :set +m
Prelude> let fac 0 = 1
Prelude|     fac n = n * fac (n-1)
Prelude|
Prelude> fac 10
3628800


per le guardie (come il tuo esempio), puoi semplicemente metterle tutte su una riga e funziona (alle guardie non interessa la spaziatura)

let abs n | n >= 0 = n | otherwise = -n

se volessi scrivere la tua funzione con più definizioni che il pattern corrisponda agli argomenti, come questo:

fact 0 = 1
fact n = n * fact (n-1)

quindi useresti le parentesi graffe con il punto e virgola che separa le definizioni

let { fact 0 = 1 ; fact n = n * fact (n-1) }




ghci