Haskell erreur: erreur d'analyse sur l'entrée '= »
-
26-09-2019 - |
Question
Caractéristiques
GHC 6.12.1
Mac OS X 10.6.4 x64
MacBook Pro
Problème
Je parviens pas à utiliser la syntaxe let
. Le code suivant refuse de compiler:
module Main where
main = let x = 1
y = 2
z = 3
in putStrLn $ "X = " ++ show x ++ "\nY = " ++ show y ++ "\nZ = " ++ show z
J'ai essayé et y = 2
tabuler dans z = 3
encore plus. Pas de dés.
(Indésirable) Solutions
La seule façon que j'ai obtenu le code de compilation est soit
- Remplacement des onglets durs avec des espaces.
- Remplacement de la clause
let
avec une clause dewhere
.
La solution
Saizan sur #haskell explique que le Missions dans une expression let avoir à aligner, pas laisser lui-même. Tant que les affectations s'alignent, il est normal d'utiliser les onglets durs ou mous onglets.
code correct:
module Main where
main = let
x = 1
y = 2
z = 3
in putStrLn $ "X = " ++ show x ++ "\nY = " ++ show y ++ "\nZ = " ++ show z
Autres conseils
Vous ne pouvez pas contrôler le retrait correctement avec des onglets, car la taille d'un onglet est défini.
Par conséquent, ne pas utiliser les onglets dans Haskell. Ils sont mal.
Indentation chaque déclaration dans le let-bloc au même degré. Aussi bonne forme est le retrait « dans » et « laisser » au même niveau. Par exemple, ..
main = let x = 1
y = 2
z = 3
in putStrLn $ "X = " ++ show x ++ "\nY = " ++ show y ++ "\nZ = " ++ show z
part, je mets virgule à la fin de chaque ligne
module Main where
main = let x = 1 ;
y = 2 ;
z = 3
in putStrLn $ "X = " ++ show x ++ "\nY = " ++ show y ++ "\nZ = " ++ show z
Si vous insistez sur les caractères TAB dans votre source, les compiles suivantes:
module Main where
main =
let x = 1
y = 2
z = 3
in putStrLn $ "X = " ++ show x ++ "\nY = " ++ show y ++ "\nZ = " ++ show z
où tous les espaces de premier plan est soit une ou deux pattes, et l'espace entre let
et x = 1
est également un onglet. Vu en mode de vi pour faire OET et ligne-ends explicites:
module Main where$ $ main =$ ^Ilet^Ix = 1$ ^I^Iy = 2$ ^I^Iz = 3$ ^Iin putStrLn $ "X = " ++ show x ++ "\nY = " ++ show y ++ "\nZ = " ++ show z$
Votre vie sera beaucoup plus simple et plus joli votre code si vous passez à des espaces.