在下面的Haskell代码中,我得到一个错误“输入中的解析错误”。从我读过的,我用过的缩进应该没问题。事实上,我在代码中的其他地方使用'let'和'in'进行了类似的缩进('let'与'in'对齐)。我打破了什么规则会导致这个'in'出现问题?如果我在'in'前面添加一个空格(使其比'let'更加一个空格),它编译得很好。
runTests :: IO ()
runTests = do
let results = fmap testLispExpr testLispText
resultStrings = fmap show results
putSeq (x:xs) = do putStrLn x
putSeq xs
putSeq [] = return ()
in putSeq resultStrings
感谢所有帮助。提前谢谢。
答案 0 :(得分:7)
let
块中的 do
语法有点滑稽。如果您想使用in
,则必须将其缩进到let
的右侧。或者,您可以完全省略in
,let
块的其余部分将显示do
绑定:
do
let ....
....
putSeq resultStrings
-- ..... (more `do` statements)
-- ^^ must all start on the same column
正如ØrjanJohansen指出的那样,do
在这种情况下根本不是必需的,因为在let
之后只有一个语句。因此,另一个选项是在保留do
关键字的同时省略in
。他们还注意到你也可以把它写成
runTests = mapM (print . testListExpr) testLispText
并且确实让事情变得干净。