2011-12-09 9 views
94

Tengo problemas para ingresar comandos de varias líneas en ghci. El siguiente código de 2 líneas trabaja a partir de un archivo:Comandos multilínea en GHCi

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

Pero cuando entro en ghci, tengo errores. También traté de poner el código dentro de :{ ... :}, pero tampoco funcionan para este ejemplo, porque esto solo agrega las líneas en una línea, lo que no debería ser el caso.

estoy usando WinGHCi, versión 2011.2.0.1

+2

posible duplicado de [¿Cómo definir una función en ghci en varias líneas?] (Http://stackoverflow.com/questions/2846050/how-to-define-a-function-in-ghci-across-multiple- líneas) – devnull

Respuesta

125

mayoría de las veces, se puede confiar en la inferencia de tipos para elaborar una firma para usted. En el ejemplo, la siguiente es suficiente:

Prelude> let addTwo x y = x + y 

Si realmente quieres una definición con una firma de tipo, o su definición se extiende a través de múltiples líneas, se puede hacer esto en ghci:

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

Nota que también se puede exprimir esta en una línea:

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

puede encontrar más información sobre la interacción con ghci en la sección de Interactive evaluation at the prompt de la documentación.

+1

Muchas gracias por las dos soluciones. Pero tengo otra pregunta relacionada: ¿por qué se requieren los cuatro espacios en blanco iniciales en la segunda línea (antes de addTwo)? Y esto tiene que ser exacto, si hay menos o más espacios en blanco, entonces hay un error. – R71

+7

@Rog 'let' comienza un bloque; las entradas en un bloque se agrupan por sangría; y el primer carácter que no sea de espacio en blanco en un bloque establece la sangría con la que están agrupados. Dado que el primer carácter que no es de espacio en blanco en el bloque 'let' de arriba es el' a' de 'addTwo', todas las líneas en el bloque deben sangrarse exactamente tan profundamente como esa' a'. –

+0

Gracias. También noté que en otros bloques de let/where.Esta es una gran diferencia con respecto a otros idiomas en los que se ignora el espacio en blanco, así que tuve algunas dificultades para comprenderlo. – R71

11

Uso let:

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

resolver este problema por el disparo de hasta GHCi y escribiendo :set +m:

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

Boom.


lo que está pasando aquí (y estoy hablando principalmente a que, googlear persona en busca de ayuda, mientras que su forma de trabajo a través Learn You A Haskell) es que GHCi es un entorno interactivo en el que se está cambiando fijaciones de nombres de funciones sobre la marcha. Tienes que ajustar tus definiciones de funciones en un bloque let, para que Haskell sepa que estás a punto de definir algo. El material :set +m es la abreviatura de la línea :{código:} constructo.

El espacio en blanco también es significativo en bloques, por lo que debe sangrar la definición de su función después de su definición de tipo en cuatro espacios para dar cuenta de los cuatro espacios en let.

+3

Tan simple, pero no obvio. ¡Quería gritarle al libro que estaba usando por no decirme eso en la página 1! – Tim