Haskell Error: error de análisis en la entrada `='
-
26-09-2019 - |
Pregunta
Especificaciones
GHC 6.12.1
Mac OS X 10.6.4 x64
MacBook Pro
Problema:
Estoy teniendo problemas para usar la sintaxis let
. El siguiente código se niega a compilar:
module Main where
main = let x = 1
y = 2
z = 3
in putStrLn $ "X = " ++ show x ++ "\nY = " ++ show y ++ "\nZ = " ++ show z
He intentado tabulación en y = 2
y z = 3
aún más. No dados.
(indeseable) Soluciones
La única manera que he recibido el código de compilación es o bien
- Sustitución de pestañas duras con espacios.
- Sustitución de la cláusula
let
con una cláusulawhere
.
Solución
Saizan en #haskell explica que el asignaciones en una expresión let que alinear, no permitir en sí. Siempre y cuando las asignaciones se alinean, es apropiado el uso de pestañas duras o blandas pestañas.
código correcto:
module Main where
main = let
x = 1
y = 2
z = 3
in putStrLn $ "X = " ++ show x ++ "\nY = " ++ show y ++ "\nZ = " ++ show z
Otros consejos
Usted simplemente no puede controlar las sangrías correctamente con pestañas debido a que el tamaño de una pestaña no está definido.
Por lo tanto, no utilice las fichas en Haskell. Están mal.
Sangría cada declaración en el let-bloque en el mismo grado. También es una buena forma para sangrar el 'en' y 'dejar' al mismo nivel. Por ejemplo ..
main = let x = 1
y = 2
z = 3
in putStrLn $ "X = " ++ show x ++ "\nY = " ++ show y ++ "\nZ = " ++ show z
Personalmente, puse punto y coma al final de cada línea
module Main where
main = let x = 1 ;
y = 2 ;
z = 3
in putStrLn $ "X = " ++ show x ++ "\nY = " ++ show y ++ "\nZ = " ++ show z
Si usted insiste en caracteres de tabulación en su origen, las siguientes compilaciones:
module Main where
main =
let x = 1
y = 2
z = 3
in putStrLn $ "X = " ++ show x ++ "\nY = " ++ show y ++ "\nZ = " ++ show z
donde todos los espacios en blanco que lleva es o bien uno o dos pestañas, y el espacio en blanco entre let
y x = 1
es también un TAB. Visto de la VI modo de lista para hacer tabulaciones y line-extremos explícita:
module Main where$ $ main =$ ^Ilet^Ix = 1$ ^I^Iy = 2$ ^I^Iz = 3$ ^Iin putStrLn $ "X = " ++ show x ++ "\nY = " ++ show y ++ "\nZ = " ++ show z$
Su vida será mucho más simple y el más bonito de código si se cambia a espacios.