4

在下面的 Haskell 代码中,我收到一个错误“输入 'in' 上的解析错误”。根据我的阅读,我使用的缩进应该没问题。事实上,我在代码的其他地方成功地使用了具有类似缩进的 'let' 和 'in'('let' 与 'in' 对齐)。我打破了什么规则导致这个“进入”成为一个问题?如果我在'in'前面添加一个空格(使其比'let'多1个空格)它编译得很好。

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

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

4

1 回答 1

7

let块中的语法do有点有趣。如果你想使用in,你必须将它缩进到let. 或者,您可以完全省略inlet绑定将在do块的其余部分可见:

           do
             let ....
                 ....
             putSeq resultStrings
         --  ..... (more `do` statements)
         --  ^^ must all start on the same column

编辑

正如 Ørjan Johansen 所指出的,do在这种情况下,实际上根本不需要,因为 . 之后只有一个语句let。所以另一种选择是省略dowhile 保留in关键字。他们还注意到您也可以将其写为

runTests = mapM (print . testListExpr) testLispText

并真正让事情变得干净。

于 2015-02-11T07:45:14.247 回答