Tengo problemas para ingresar comandos de varias líneas en ghci.
El siguiente código de 2 líneas funciona desde un archivo:
addTwo :: Int -> Int -> Int
addTwo x y = x + y
Pero cuando entro en ghci, aparece un error:
<interactive>:1:1: error:
Variable not in scope: addTwo :: Int -> Int -> Int
También intenté poner el código dentro :{ ... :}
, 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
Respuestas:
La mayoría de las veces, puede confiar en la inferencia de tipos para elaborar una firma para usted. En su ejemplo, lo siguiente es suficiente:
Si realmente desea una definición con una firma de tipo, o su definición abarca varias líneas, puede hacerlo en ghci:
Tenga en cuenta que también puede exprimir esto en una línea:
Puede encontrar más información sobre cómo interactuar con ghci en la evaluación interactiva en la sección de solicitud de la documentación.
fuente
let
comienza un bloque; las entradas en un bloque se agrupan por sangría; y el primer carácter que no es un espacio en blanco en un bloque establece la sangría por la que se agrupan. Como el primer carácter que no es un espacio en blanco en ellet
bloque de arriba es ela
deaddTwo
, todas las líneas del bloque deben tener una sangría exactamente igual de profundaa
.Resuelva este problema activando GHCI y escribiendo
:set +m
:Auge.
Lo que está sucediendo aquí (y te estoy hablando principalmente a ti , persona buscando ayuda en Google mientras te abres paso a través de Learn You A Haskell ) es que GHCI es un entorno interactivo donde estás cambiando enlaces de nombres de funciones sobre la marcha. Debe ajustar las definiciones de sus funciones en un
let
bloque, para que Haskell sepa que está a punto de definir algo. El:set +m
material es una abreviatura para la construcción del:{
código multilínea:}
.El espacio en blanco también es significativo en los 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 tener en cuenta los cuatro espacios
let
.fuente
echo ':set +m' >> ~/.ghci
para hacer que esta configuración sea persistente.let
solo en la primera línea, luego todo el resto no necesita sangrarse en absoluto. donde el espacio en blanco realmente cuenta es que no debe haber espacios finales en sus líneas. el espacio en blanco al final cuenta como un Enter adicional y rompe el bloque de varias líneas.Uso
let
:fuente
A partir de GHCI versión 8.0.1 ,
let
ya no es necesario definir funciones en el REPL.Entonces esto debería funcionar bien para usted:
La inferencia de tipos de Haskell proporciona una tipificación generalizada que también funciona para flotantes:
Si debe proporcionar su propio tipeo, parece que tendrá que usarlo
let
combinado con entrada multilínea (use:set +m
para habilitar la entrada multilínea en GHCI):Pero obtendrá errores si intenta pasar cualquier cosa menos
Int
debido a su escritura no polimórfica:fuente
Para ampliar la respuesta de Aaron Hall , al menos en la versión GHCi 8.4.4, no necesita usar
let
declaraciones de tipo si usa el:{
:}
estilo. Esto significa que no tiene que preocuparse por agregar la sangría de 4 espacios en cada línea posterior para tener en cuentalet
, haciendo que las funciones más largas sean mucho más fáciles de escribir, o en muchos casos, copiar y pegar (ya que la fuente original probablemente no tendrá la sangría correcta):Actualizar
Como alternativa, puede activar el modo de entrada multilínea
:set +m
, luego escribirlet
solo, presionar Entrar y luego pegar definiciones sin necesidad de sangría.Sin embargo, esto no parece funcionar con algunos bloques de código, como:
Pero el
:{
,:}
técnica hace.fuente
:{
, luego en la siguiente línealet
por sí mismo, luego pegar sus definiciones sin sangrado adicional, y luego cerrar con:}
. :) y con el modo de entrada multilínea set (:set +m
) ni siquiera necesitaba los comandos de llaves siempre que no hubiera espacios finales en las líneas de código.:set +m
¿puedes usarlolet
en su propia línea? Entonces puedes, eso es genial. Gracias.let
luego la nueva línea no funciona. Mira mi edición.