2016-09-08 3 views
0

Почему код Haskell производит Parse error on input '=' в строке 9 (t = 1)?Ошибка анализа на входе

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

Поскольку это 'do'-block, и вам нужно' let'. – arrowd

+0

Если я добавлю let в начале этой строки, я получаю «parse error in let binding: missing required» in »вместо этого. –

ответ

4

Вы пропускаете let для объявления t, и вы должны использовать некоторые отступов вместо скобок и запятой:

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

В большинстве случаев код Haskell использует отступы, но скобки и точки с запятой являются законными. –

+0

@ ThomasM.DuBuisson законно, да, но imo они должны быть опущены там, где они не нужны, когда вы используете несколько строк. Я вижу их только в одном лайнере. – Bergi

0

Как уже отмечалось, вы пропустили let ключевое слово, прежде чем t = 1 , Я был удивлен, увидев, что вы все равно получите ошибку разбора, как только это будет добавлено.

Синтаксически правильное решение с фигурными скобками и точкой с запятой, как в исходном примере:

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 
      } 
} 

Для того, чтобы получить его для компиляции вы можете изменить return 0 к return():

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 
      } 
} 
Смежные вопросы