2010-06-18 13 views
18

Estoy jugando con GHCi por primera vez, y estoy teniendo problemas para escribir funciones de varias líneas. Mi código es el siguiente:¿Cómo uso múltiples cláusulas where en GHCi?

Prelude> :{ 
Prelude| let diffSquares lst = abs $ squareOfSums lst - sumOfSquares lst 
Prelude| where 
Prelude|  squareOfSums lst = (fst (sumsAndSquares lst))^2 
Prelude|  sumOfSquares lst = snd (sumsAndSquares lst) 
Prelude|  sumsAndSquares = foldl (\(sms,sqrs) x -> (sms+x,sqrs+x^2)) (0,0) 
Prelude| :} 

Se da el siguiente error:

<interactive>:1:142: parse error on input `=' 

Podría alguien amablemente me punto en la dirección de lo que me falta?

Respuesta

29

Desde el manual de ayuda de ghci (http://www.haskell.org/ghc/docs/6.10.4/html/users_guide/interactive-evaluation.html):

Such multiline commands can be used with any GHCi command, and the lines between :{ and :} are simply merged into a single line for interpretation. That implies that each such group must form a single valid command when merged, and that no layout rule is used.

lo tanto, debe insertar un punto y coma entre cada definición, por ejemplo,

Prelude> :{ 
Prelude| let a x = g 
Prelude| where 
Prelude|  g = p x x;  {- # <----- # -} 
Prelude|  p a b = a + b 
Prelude| :} 

Editar: Parece que necesita un par de llaves en lugar de la versión reciente de GHCi.

Prelude> :{ 
Prelude| let { a x = g 
Prelude| where 
Prelude|  g = p x x 
Prelude|  p a b = a + b 
Prelude| } 
Prelude| :} 
Prelude> a 5 
10 
+0

Genial, muchas gracias. –

+1

ingenioso, excelente respuesta. Nunca visto o usado esto antes. –

+0

No funciona a partir de GHC 7.6.3 en los paquetes de Ubuntu: error de análisis en la entrada "donde" –

5

The golden rule of indentation: código que forma parte de alguna expresión debe sangría adicional en que el comienzo de que la expresión de (incluso si la expresión no es el elemento más a la izquierda de la línea).

Prelude> :set +m 

incorrecto:

Prelude> let foo = x 
Prelude|  where x = 1 
Prelude| 

<interactive>:3:1: 
    parse error in let binding: missing required 'in' 

Derecha:

Prelude> let foo = x 
Prelude|  where x = 1 
Prelude| 

No hay necesidad de llaves o punto y coma.

Cuestiones relacionadas