SPOJ在Haskell中的“生命,宇宙和一切” - “if”解析错误

时间:2014-03-01 11:07:31

标签: haskell if-statement io parse-error

我是Haskell的初学者,想要开始解决它的问题,所以我试图解决第一个SPOJ问题(问题代码:TEST)。 “问题”是读取行并打印它们直到“42”出现。

main = do input <- getLine
          if input == "42" then putStr "" 
          else do putStrLn input
                  main

我的解决方案很简单,但输入'if'时出现解析错误。当我在开头和else语句中将'main'更改为'main2'时,一切正常。为什么'if'上有解析错误?

2 个答案:

答案 0 :(得分:8)

您的编辑器混合了标签和空格,当您的编辑器将标签显示为4个空格时,Haskell会将标签解释为8个字符。

请注意,您无法在普通代码块中的StackOverflow上重现您的代码,因为StackOverflow会自动用空格替换制表符。试着自己 - 将问题中的代码复制到编辑器中,假设它不会自动将开头的空格转换为制表符。

因此,在编辑器中禁用选项卡并将现有选项卡转换为四个空格,您应该没问题。

答案 1 :(得分:0)

尝试在右侧比“if”更多地缩进“else”。现在不再需要这个(IIRC),但早期的编译器要求这样做。原因是在do块中,您的代码被解析为:

main = do { input <- getLine ;
            if input == "42" then putStr "" ;  -- parse error, no "else"
            else do { putStrLn input ;
                      main
                    }
          }

新的编译器应该允许额外的“;”除了“别的”,老年人没有。

有关详细信息,请参阅DoIfThenElse