2010-08-09 7 views
6

SpecsHaskell Fehler: Parsen Fehler bei der Eingabe `=‘

GHC 6.12.1

Mac OS X 10.6.4 x64

MacBook Pro

Problem

Ich habe Probleme mit let Syntax. Der folgende Code weigert zu kompilieren:

module Main where 

main = let x = 1 
     y = 2 
     z = 3 
    in putStrLn $ "X = " ++ show x ++ "\nY = " ++ show y ++ "\nZ = " ++ show z 

Ich habe versucht, in y = 2 und z = 3 noch Tabbing. Kein Würfel.

(Unerwünschte) Lösungen

Der einzige Weg, ich den Code bekommen habe zu kompilieren sind entweder

  1. mit Leerzeichen hart Tabs austauschen.
  2. Ersetzen Sie die let Klausel durch eine where Klausel.
+2

nie Registerkarten mit Haskell, immer Leerzeichen verwenden.Tabs in Haskell sind mit 8 Leerzeichen definiert, was viel mehr ist, als die Leute ihren Editor erwarten/einstellen, daher ist es immer ratsam, Leerzeichen zu verwenden. Mit jedem anständigen Editor können Sie Registerkarten erstellen, um Leerzeichen zu erzeugen. – Axman6

+0

Ich fand dies eine ausgezeichnete visuelle Hilfe und eine hervorragende Anleitung zum Thema insgesamt: [http://echo.rsmw.net/n00bfaq.html#visualaid](http://echo.rsmw.net/n00bfaq.html# visualaid) – Brandon

Antwort

15

Saizan auf #haskell erklärt, dass die Zuweisungen in einem lassen Ausdruck auszurichten, nicht lassen selbst. Solange sich die Zuweisungen in einer Linie befinden, ist es in Ordnung, harte Tabs oder weiche Tabs zu verwenden.

Korrekter Code:

module Main where 

main = let 
     x = 1 
     y = 2 
     z = 3 
    in putStrLn $ "X = " ++ show x ++ "\nY = " ++ show y ++ "\nZ = " ++ show z 
+1

Ich habe festgestellt, dass die Bindungen (x, y, z) vertikal ausgerichtet werden müssen, im Gegensatz zu Zuweisungszeichen (=) der 3 Bindungen, die bei diesem Beispiel schwer zu erkennen sind. – ssanj

3

Jede Deklaration im Let-Block im gleichen Grad einrücken. Eine gute Form ist auch, das "In" und "Let" auf die gleiche Ebene zu setzen. ZB ..

main = let x = 1 
      y = 2 
      z = 3 
     in putStrLn $ "X = " ++ show x ++ "\nY = " ++ show y ++ "\nZ = " ++ show z 
+0

Wie mache ich das mit harten Tabs? – mcandre

+9

Warum möchten Sie harte Tabs verwenden? Sie sind in den Sprachen, in denen die Einrückung keine Bedeutung hat, einigermaßen in Ordnung, aber in Sprachen wie Haskell oder Python werden sie dir das Leben schwer machen. Wie sie gerade sind. – jrockway

+4

Python behandelt harte Tabs ausgezeichnet. Einmal hatte ich Schwierigkeiten, Python über einen Web-SSH-Client zu codieren, weil der Client keine Tabs einfügen konnte. Ich verwende harte Tabs, weil ich es hasse, den Code anderer Leute gewaltsam in meine bevorzugte Einrückungsbreite einzubauen. Harte Registerkarten haben dieses Problem nicht, da Texteditoren feste Registerkarten in jeder Breite anzeigen können. – mcandre

11

Sie können nicht einfach Vertiefung mit Registerkarten steuern korrekt, da die Größe eines Reiters nicht definiert ist.

Verwenden Sie daher keine Tabs in Haskell. Sie sind böse.

+3

Oder, für Dinge, die eine andere Ebene der Einrückung haben müssen, verwenden Sie eine neue Zeile. Z. B. setzen Sie "Let" auf eine Zeile und "x = 1" auf die nächste. Dann sind Tabs kein Problem. – yfeldblum

+0

Neil, ich bitte um Unterschiede (siehe meine Antwort). Ein Typ auf #haskell konnte mir helfen, eine kompilierende Version mit harten Tabs zu erstellen. Tatsächlich ist die Antwort der Justiz richtig. – mcandre

+0

Ich habe meine Lektion auf die harte Tour gelernt! Ich wusste, Tabs waren schrecklich, aber immer noch benutzt, nur weil es mir noch nie ein Problem gab. Wenn du wie ich bist, rette dir zukünftige Kopfschmerzen und nimm diesen Rat jetzt an! – MasterMastic

1

Wenn Sie darauf bestehen, TAB-Zeichen in Ihrer Quelle, die folgenden compiliert:

module Main where 

main = 
    let x = 1 
     y = 2 
     z = 3 
    in putStrLn $ "X = " ++ show x ++ "\nY = " ++ show y ++ "\nZ = " ++ show z 

, wo alle führenden Leerzeichen entweder ein oder zwei Tabulatoren und die Leerzeichen zwischen let und x = 1 ist auch ein TAB ist. So gesehen vi die list mode zu TABs zu machen und Zeilenenden ausdrücklich:

module Main where$ 
$ 
main =$ 
^Ilet^Ix = 1$ 
^I^Iy = 2$ 
^I^Iz = 3$ 
^Iin putStrLn $ "X = " ++ show x ++ "\nY = " ++ show y ++ "\nZ = " ++ show z$

Ihr Leben viel einfacher sein wird, und Ihr Code schöneren, wenn Sie auf Räume wechseln.

+0

Danke. Ich glaube nicht, dass ich mich daran erinnern will, jedes Mal zwischen Let und X zu wechseln. Außerdem wird jeder Code, den ich poste, wahrscheinlich Fehler verursachen, da Leser annehmen werden, dass dort ein gewöhnlicher Platz ist. – mcandre

+0

Daher, warum harte Tabs Ihren Code schwerer zu codieren und zu lesen macht! – adamse

2

Ich persönlich setzen Semikolon am Ende jeder Zeile

module Main where 

main = let x = 1 ; 
      y = 2 ; 
      z = 3 
in putStrLn $ "X = " ++ show x ++ "\nY = " ++ show y ++ "\nZ = " ++ show z 
+0

Es wird mit Semikolon arbeiten, aber ich werde nicht verwenden, da die Sprache es gut funktioniert. Verwenden Sie für die Einrückung Leerzeichen anstelle von Tabs (oder Tabs korrekt). – Jaider