Error de Haskell error de análisis en la entrada '='

111

Soy nuevo en Haskell y después de comenzar ghciprobé:

f x = 2 * x

y obtuve:

<interactive>:1:4: parse error on input `='

que no entiendo.

Curiosamente, funcionó bien antes. Supongo que he hecho un Haskell mal configurado. Reinstalar ghc6 no resuelve el problema.

Para obtener información, uso Ubuntu 10.4 y la versión de ghc6 es 6.12.1-12

Hijo
fuente

Respuestas:

160

En GHCi 7.xo versiones anteriores, necesita un letpara definir cosas en él.

Prelude> let f x = x * 2
Prelude> f 4
8

A partir de GHC 8.0.1, los enlaces de nivel superior son compatibles con GHCi , por lo que el código de OP funcionará sin cambios.

GHCi, version 8.0.1.20161213: http://www.haskell.org/ghc/  :? for help
Prelude> f x = x * 2
Prelude> f 4
8
Kennytm
fuente
15
Gracias. "Real world haskell" (al menos la versión que tengo) no tiene el leten sus ejemplos
Micah
43
"Learn you Haskell" no menciona esto en absoluto.
Bakuriu
2
@Bakuriu LYAH qué ahora mencionan let. Pero un seguimiento. En LYAHleí addThree :: Int -> Int -> Int -> Int(nueva línea) addThree x y z = x + y + zpero solo el segundo se ejecuta GHCicon let. ¿Por qué?
isomorfismos
9
@Bakuriu Sí, pero el autor te dice que escribas tus definiciones en un archivo externo y lo cargues dentro de GHCI, no que las escribas directamente en GHCI. Y el primero funciona perfectamente.
superzamp
Este tutorial es, entonces, completamente incorrecto: seas.upenn.edu/~cis194/lectures/01-intro.html . ¡Sin embargo, es el primer tutorial recomendado en el sitio web de haskell!
cammil
51

Cuando escribe en un archivo fuente de Haskell,

f x = 2 * x

es correcto.

Cuando escribe directamente en ghci, debe escribir letal principio de la línea:

let f x = 2 * x
dave4420
fuente
12
¿Por qué no funciona en GHCi? ¿Por qué hay una diferencia en la sintaxis?
Batir el
1
@Beat GHCi intenta evaluar expresiones de forma predeterminada, no analizar declaraciones, mientras que el formato de archivo es el opuesto. Por eso, para hacer declaraciones (es decir, establecer variables, definir funciones, etc.) tienes que declarar que estás usando let. Piense en GHCi como una gran let ... in ...declaración.
AJFarmar
20

Una buena regla general para usar ghci es que cualquier código que ingrese debe ajustarse a la semántica de do-block; es decir, podría asumir sintácticamente que está programando dentro de la mónada IO (si esta es una terminología nueva, no se preocupe, le recomiendo leer este tutorial ).

Esta respuesta ilustra este punto con un ejemplo y puede proporcionar más información práctica sobre la naturaleza de IO y ghci.

Raeez
fuente
26
Esta respuesta es inútil para un principiante. Está buscando una pista sencilla y viable para avanzar, no temas avanzados. No le explicas los productos polinomiales a un niño que está aprendiendo la tabla de multiplicar; no muestra cuánto sabes, muestra que no sabes cómo compartir lo que sí sabes.
btk
3
@btk: todo el mundo tiene que dejar de ser principiante en algún momento. Empecé a aprender Haskell ayer y estoy seguro de que en poco tiempo entenderé todo lo que dice Raeez.
Vietnhi Phuvan
10
Este es mi primer día aprendiendo Haskell, y encontré esta respuesta muy útil para entender por qué tengo que usar let; Yo estaba como "wtf, por qué tengo que usar let" y luego leí esto y me iluminé.
Brian Tingle
4

A partir de GHC 8.0.1, esto ya no generaría un error.

glguy
fuente