Erro Haskell: Erro de análise na entrada `= '
-
26-09-2019 - |
Pergunta
Especificações
GHC 6.12.1
Mac OS X 10.6.4 x64
MacBook Pro
Problema
Estou tendo problemas para usar let
sintaxe. O código a seguir se recusa a compilar:
module Main where
main = let x = 1
y = 2
z = 3
in putStrLn $ "X = " ++ show x ++ "\nY = " ++ show y ++ "\nZ = " ++ show z
Eu tentei tabular y = 2
e z = 3
ainda mais. Sem dados.
Soluções (indesejáveis)
A única maneira de comprar o código para compilar é
- Substituindo guias duras por espaços.
- Substituindo o
let
Cláusula com umwhere
cláusula.
Solução
Saizan em #haskell explica que o atribuições em uma expressão let tem que se alinhar, não deixar em si. Enquanto as atribuições se alinham, não há problema em usar guias duras ou guias suaves.
Código correto:
module Main where
main = let
x = 1
y = 2
z = 3
in putStrLn $ "X = " ++ show x ++ "\nY = " ++ show y ++ "\nZ = " ++ show z
Outras dicas
Você simplesmente não pode controlar o recuo corretamente com as guias porque o tamanho de uma guia é indefinido.
Portanto, não use guias em Haskell. Eles são maus.
Recupere cada declaração no let-bloqueio no mesmo grau. Também a boa forma é recuperar o 'in' e 'vamos' ao mesmo nível. Por exemplo..
main = let x = 1
y = 2
z = 3
in putStrLn $ "X = " ++ show x ++ "\nY = " ++ show y ++ "\nZ = " ++ show z
Pessoalmente, coloquei semicolon no final de cada linha
module Main where
main = let x = 1 ;
y = 2 ;
z = 3
in putStrLn $ "X = " ++ show x ++ "\nY = " ++ show y ++ "\nZ = " ++ show z
Se você insistir nos caracteres da guia em sua fonte, os seguintes compilam:
module Main where
main =
let x = 1
y = 2
z = 3
in putStrLn $ "X = " ++ show x ++ "\nY = " ++ show y ++ "\nZ = " ++ show z
onde todo o espaço de branco principal é uma ou duas guias, e o espaço em branco entre let
e x = 1
também é uma guia. Visto em Vi's modo de lista Para tornar as guias e as extremidades de linha explícitas:
module Main where$ $ main =$ ^Ilet^Ix = 1$ ^I^iy = 2$ ^I^iz = 3$ ^Iin putStrLn $ "X = " ++ show x ++ "\nY = " ++ show y ++ "\nZ = " ++ show z$
Sua vida será muito mais simples e seu código mais bonito se você mudar para os espaços.