2011-12-29 16 views
8

Estoy revisando el libro Natural Language Processing for Working Programmers. El libro usa Haskell, con el que no tengo mucha experiencia. El código siguiente genera un error en GHCiHaskell: "La última declaración en una construcción 'do' debe ser una expresión"

:{ 
do 
    l <- [0..9] 
    ps <- (\x -> [x-1, x+2]) l 
    return ps 
:} 

Este es el mensaje de error devuelto

The last statement in a 'do' construct must be an expression

Todas las respuestas que he encontrado parece sugerir que es un error sangría, pero en lo que Puedo decir que la sangría parece correcta. Alguna idea de cual puede ser el problema?

+0

¿Qué versión de ghci estás usando? En Windows/OSX/Ubuntu/Fedora/...? – dave4420

+0

6.12.1 en Ubuntu 10.04. ¿Podría ser ese el problema? –

Respuesta

4

He escrito su código en ghci 7.0.3 y no he recibido ningún error.

Prelude> :{ 
Prelude| do 
Prelude| l <- [0..9] 
Prelude| ps <- (\x -> [x-1, x+2]) l 
Prelude| return ps 
Prelude| :} 
[-1,2,0,3,1,4,2,5,3,6,4,7,5,8,6,9,7,10,8,11] 

Editar: Cuando uso ghci 6.12.1 tal como está empaquetado en Ubuntu 10.04, me sale el mismo error que tú.

+0

Sospecho que puedo tener una versión demasiado vieja. Lo obtuve del repositorio en lugar del sitio web de haskell. 6.12.1 en Ubuntu 10.04. Gracias. –

+0

Sí, parece el problema. – dave4420

0

Los símbolos de :{ y :} no son parte de Haskell, creo que tiene algo que ver con el texto que está leyendo. Además, el código que ha publicado tiene una lambda utilizada como una lista de mónadas. Pruebe esto:

do 
    l <- [0..9] 
    ps <- (\x -> [x-1, x+2]) l 
    return ps 
+1

Tenía la impresión de que ': {' y ':}' eran necesarios para el código multilínea en GHCi. Dejó fuera el argumento de la lista por error, lo siento. Sin embargo, no he envuelto mi cabeza con mónadas. ¿Se supone que debo usar tu código como está en GHCi? Cada línea se interpreta de forma independiente. –

+0

Creo que puedo haber encontrado una salida, basada en http://stackoverflow.com/a/3532505/420386. Usar secuaces parece resolver el problema, aunque me hace sentir un poco sucio :) Gracias. –

+1

': {' y ':}' son necesarios para el código multilínea en ghci, sí. – dave4420

Cuestiones relacionadas