Estoy tratando de definir cualquier función simple que abarque varias líneas en ghci, tome lo siguiente como ejemplo:
let abs n | n >= 0 = n
| otherwise = -n
Hasta ahora he intentado presionar Enter después de la primera línea:
Prelude> let abs n | n >= 0 = n
Prelude> | otherwise = -n
<interactive>:1:0: parse error on input `|'
También intenté usar los comandos :{y :}pero no llego lejos:
Prelude> :{
unknown command ':{'
use :? for help.
Estoy usando GHC Interactive versión 6.6 para Haskell 98 en Linux, ¿qué me estoy perdiendo?

:{,:}.Respuestas:
Para los guardias (como su ejemplo), puede ponerlos todos en una línea y funciona (a los guardias no les importa el espaciado)
Si desea escribir su función con múltiples definiciones que coincidan con el patrón en los argumentos, así:
Luego usaría llaves con punto y coma que separan las definiciones
fuente
GHCi ahora tiene un modo de entrada multilínea, habilitado con: set + m. Por ejemplo,
fuente
ghcise parezca mucho al intérprete de Python a este respecto. ¡Muy conveniente! De hecho, puede crear un.ghciarchivo en su directorio de inicio en el que lo coloque:set +my el modo multilínea se convertirá en el predeterminado cada vez que comienceghci.:set prompt "λ "las líneas continuas dicen enPreludelugar deλ. ¿Alguna forma de evitar esto?let. Simplemente escriba unletseguido de una nueva línea:let⏎. Entoncesfac 0 = 1⏎. Entoncesfac n = n * fac (n-1)⏎ ⏎ y listo!Dan es correcta, pero
:{y:}debe aparecer cada uno en su propia línea:Esto también interactúa con la regla de diseño, por lo que cuando se usa la notación de do puede ser más fácil usar llaves y punto y coma explícitamente. Por ejemplo, esta definición falla:
Pero funciona cuando se agregan llaves y punto y coma:
Esto solo importará realmente cuando pegue definiciones de un archivo, donde la sangría podría cambiar.
fuente
Parece
:{y:}es una característica bastante nueva. Es posible que deba actualizar GHC.Editar: confirmado, ver http://www.haskell.org/ghc/docs/6.8.2/html/users_guide/release-6-8-2.html
fuente
Si no desea actualizar GHC solo por
:{y:}, deberá escribirlo todo en una línea:No conozco ninguna definición única en Haskell que deba escribirse en varias líneas. Lo anterior sí funciona en GHCi:
Para otras expresiones, como los
dobloques, deberá usar la sintaxis sin diseño con llaves y punto y coma (eugh).fuente
Estoy usando GHCi, versión 8.2.1 en macOS Catalina 10.15.2. Lo siguiente es cómo pongo juntos la declaración de tipo de función y los guardias. Tenga en cuenta que las barras verticales a la izquierda son para líneas múltiples de GHCi.
fuente
:{y:}no necesita especificarletantes de su declaración de tipo, lo que significa que no necesita sangrar la segunda línea y las siguientes.Parece que pegar ambas líneas a la vez o usar control-enter para cada nueva línea lo mantiene todo junto, al menos en https://repl.it/languages/haskell . Verás 2 puntos al comienzo de la segunda línea. O póngalo en un archivo y: cargue el archivo (: l main). ¿Cómo es que los abdominales no funcionan con números negativos? Oh, tienes que poner paréntesis alrededor del número.
fuente