2016-09-08 5 views
0

Warum produziert dieser Haskell-Code Parse error on input '=' in Zeile 9 (t = 1)?Parse-Fehler am Eingang

module Main where 
import System.IO 
import Data.List.Split 
main = do { 
    flag <- isEOF; 
    if flag then return 0 
    else do { 
     s <- getLine; 
     t = 1; 
     print s; 
    } 
} 
+4

Da es sich um eine 'do'-block und du brauchst' let'. – arrowd

+0

Wenn ich let am Anfang dieser Zeile hinzufügen, bekomme ich "Parse-Fehler in Let Binding: fehlende erforderlich" in "" stattdessen. –

Antwort

4

Sie vermissen eine let für die Deklaration von t, und Sie sollten eine Vertiefung statt Klammern und Semikolons verwenden:

module Main where 

import System.IO 
import Data.List.Split 

main = do 
    flag <- isEOF 
    if flag 
    then return 0 
    else do 
     s <- getLine 
     let t = 1 
     print s 
+0

Die meisten Haskell-Code verwendet Einrückung, aber Klammern und Semikolon sind legitim. –

+0

@ ThomasM.DuBuisson legit, ja, aber imo sie sollten weggelassen werden, wo sie nicht notwendig sind, wenn Sie mehrere Zeilen verwenden. Ich sehe sie nur in Einzeilern. – Bergi

0

Wie andere bereits erwähnt haben, haben Sie einen let Schlüsselwort vor t = 1 verpasst . Ich war überrascht zu sehen, dass Sie immer noch einen Parse-Fehler bekommen, sobald dieser hinzugefügt wird.

Eine syntaktisch gültige Lösung mit Klammern und Semikolons wie in Ihrem ursprünglichen Beispiel ist:

module Main where 
import System.IO 
import Data.List.Split 
main = do { 
    flag <- isEOF; 
    if flag then return 0 
    else do { s <- getLine 
      ; let t = 1 
      ; print s 
      } 
} 

Um es zu bekommen Sie return 0-return() ändern zu kompilieren:

module Main where 
import System.IO 
import Data.List.Split 
main = do { 
    flag <- isEOF; 
    if flag then return() 
    else do { s <- getLine 
      ; let t = 1 
      ; print s 
      } 
} 
Verwandte Themen