haskell - plataforma - Comandos multilínea en GHCi
haskell website (3)
Tengo problemas al 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 ingreso ghci, obtengo errores. También traté de 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
La mayoría de las veces, puede confiar en la inferencia de tipo para encontrar una firma para usted. En su ejemplo, lo siguiente es suficiente:
Prelude> let addTwo x y = x + y
Si realmente desea una definición con una firma de tipo, o su definición abarca varias líneas, puede hacerlo en ghci:
Prelude> :{
Prelude| let addTwo :: Int -> Int -> Int
Prelude| addTwo x y = x + y
Prelude| :}
Prelude> addTwo 4 7
11
Tenga en cuenta que también puede exprimir esto en una línea:
Prelude> let addTwo :: Int -> Int -> Int ; addTwo x y = x + y
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.
Resuelva este problema activando 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
Auge.
Lo que está sucediendo aquí (y estoy hablando principalmente de ti , persona buscando ayuda en Google mientras trabajas en Learn You A Haskell ) es que GHCI es un entorno interactivo en el que cambias los enlaces de nombres de funciones sobre la marcha. Tienes que ajustar las definiciones de tus funciones en un bloque let
, para que Haskell sepa que estás a punto de definir algo. El :set +m
es una abreviatura de la línea múltiple :{
code :}
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
.
Use let
:
Prelude> :{
Prelude| let addTwo :: Int -> Int -> Int
Prelude| addTwo x y = x + y
Prelude| :}
Prelude> addTwo 2 3
5