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
ghci
se parezca mucho al intérprete de Python a este respecto. ¡Muy conveniente! De hecho, puede crear un.ghci
archivo en su directorio de inicio en el que lo coloque:set +m
y el modo multilínea se convertirá en el predeterminado cada vez que comienceghci
.:set prompt "λ "
las líneas continuas dicen enPrelude
lugar deλ
. ¿Alguna forma de evitar esto?let
. Simplemente escriba unlet
seguido 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
do
bloques, 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 especificarlet
antes 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