我是Haskell的初学者,想开始用它解决问题,所以我尝试解决第一个SPOJ问题(问题代码:TEST)。"问题"是阅读行并打印它们,直到出现"42"。
main = do input <- getLine
if input == "42" then putStr ""
else do putStrLn input
main
我的解决方案非常简单,但是在输入"if"时出现解析错误。当我在开头和 else-语句中将"main"更改为"main2"时,一切正常。为什么"if"上会出现解析错误?
您的编辑器混合了制表符和空格,当编辑器将制表符显示为 4 个空格时,Haskell 将制表符解释为 8 个字符。
请注意,您不能在普通代码块中在StackOverflow上重现代码,因为StackOverflow会自动将制表符替换为空格。自己尝试 - 将问题中的代码复制到编辑器中,假设它不会自动将开头的空格转换为选项卡。
因此,在编辑器中禁用制表符并将现有制表符转换为四个空格,您应该没问题。
右侧缩进"else"而不是"if"。现在不再需要这样做(IIRC),但早期的编译器需要这样做。原因是在 do 块中,您的代码被解析为:
main = do { input <- getLine ;
if input == "42" then putStr "" ; -- parse error, no "else"
else do { putStrLn input ;
main
}
}
新的编译器应该允许额外的";"而不是"else",而旧的编译器则不允许。
有关更多详细信息,请参阅 DoIfThenElse。