这个Haskell let-in缩进有什么问题?

时间:2015-02-11 07:38:23

标签: haskell syntax indentation let do-notation

在下面的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

感谢所有帮助。提前谢谢。

1 个答案:

答案 0 :(得分:7)

let块中的

do语法有点滑稽。如果您想使用in,则必须将其缩进到let的右侧。或者,您可以完全省略inlet块的其余部分将显示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

并且确实让事情变得干净。