2010-08-09 9 views
6

EspecificacionesHaskell error: parse error en la entrada `='

GHC 6.12.1

Mac OS X 10.6.4 x64

MacBook Pro

Problema

Tengo 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 

Me trataron de tabulación en y = 2 y z = 3 aún más. No dados.

(adversas) Soluciones

La única manera que he recibido el código para compilar es o bien

  1. Sustitución de pestañas duras con espacios.
  2. Reemplazar la cláusula let con una cláusula where.
+2

nunca use pestañas con Haskell, siempre use espacios.Las pestañas en haskell se definen como 8 espacios, que es mucho más de lo que la gente a menudo espera/establece su editor, por lo que siempre se recomienda utilizar espacios. Cualquier editor decente le permitirá hacer pestañas para producir espacios. – Axman6

+0

Encontré esto una excelente ayuda visual, y una excelente guía sobre el tema en general: [http://echo.rsmw.net/n00bfaq.html#visualaid](http://echo.rsmw.net/n00bfaq.html# visualaid) – Brandon

Respuesta

15

Saizan en #haskell explica que las asignaciones en una expresión dejar que tienen que alinearse, no vamos sí. Mientras las asignaciones se alineen, está bien usar pestañas o pestañas suaves.

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 
+1

Encontré que los enlaces (x, y, z) tienen que alinearse verticalmente en oposición a los signos de asignación (=) de los 3 enlaces que pueden ser difíciles de ver con este ejemplo. – ssanj

3

Aplicar sangría a cada declaración en el bloque de retención con el mismo grado. También es buena forma 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 
+0

¿Cómo hago esto con pestañas difíciles? – mcandre

+9

¿Por qué quieres usar pestañas duras? Están moderadamente bien en los idiomas que no usan sangría para el significado, pero simplemente te dificultarán la vida en idiomas como Haskell o Python. Como son en este momento. – jrockway

+4

Python maneja las pestañas duras de forma excelente. Una vez, tuve problemas para codificar Python a través de un cliente web SSH porque el cliente no podía insertar pestañas. Utilizo pestañas difíciles porque odio tener que forzar a la fuerza el código de otras personas con mi ancho de sangría preferido. Las pestañas difíciles no tienen ese problema, ya que los editores de texto pueden ver pestañas duras de cualquier ancho. – mcandre

11

Usted simplemente no puede controlar la sangría correctamente con pestañas debido a que el tamaño de una pestaña no está definido.

Por lo tanto, no use pestañas en Haskell. Ellos son malvados

+3

O, para cosas que necesitan tener un nivel diferente de sangría, use una nueva línea. Por ejemplo, pon 'let' en una línea y' x = 1' en la siguiente. Entonces las pestañas no son un problema. – yfeldblum

+0

Neil, me permito diferir (ver mi respuesta). Un tipo en #haskell pudo ayudarme a construir una versión de compilación, de pestañas fijas. De hecho, la respuesta de Justice es correcta. – mcandre

+0

¡Aprendí mi lección de la manera difícil! Sabía que las pestañas eran horribles pero seguían usándose solo porque nunca me habían dado un problema. Si eres como yo, ahórrate un gran dolor de cabeza en el futuro y sigue este consejo, ¡ahora! – MasterMastic

1

Si insiste en caracteres de tabulación en su origen, las siguientes: compila

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 una o dos fichas, y el espacio en blanco entre let y x = 1 es también un TAB. Visto en vi de list mode para hacer tabulaciones y alineación termina 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 su código más bonito si se cambia a espacios.

+0

Gracias. No creo que quiera recordar tabular entre let yx cada vez. Además, cualquier código que publique probablemente cause errores ya que los lectores supondrán que hay un espacio común allí. – mcandre

+0

¡De ahí que las pestañas duras hagan que su código sea más difícil de codificar y leer! – adamse

2

Personalmente, pongo 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 
+0

Funcionará con punto y coma, pero no lo utilizaré ya que el lenguaje funciona bien. Solo para sangría, use espacios en lugar de pestañas (o pestañas correctamente). – Jaider

Cuestiones relacionadas