我是Haskell的初学者,想要开始解决它的问题,所以我试图解决第一个SPOJ问题(问题代码:TEST)。 “问题”是读取行并打印它们直到“42”出现。
main = do input <- getLine
if input == "42" then putStr ""
else do putStrLn input
main
我的解决方案很简单,但输入'if'时出现解析错误。当我在开头和else语句中将'main'更改为'main2'时,一切正常。为什么'if'上有解析错误?
答案 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。