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

问题描述 投票:4回答:1

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

所有帮助表示赞赏。提前致谢。

haskell syntax indentation let do-notation
1个回答
7
投票

let块中的do语法有点滑稽。如果你想使用in,你必须将它缩进到let的右边。或者,您可以完全省略in,并且let块的其余部分将显示do绑定:

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

Edit

正如ØrjanJohansen指出的那样,在这种情况下,do实际上并不是必需的,因为在let之后只有一个声明。所以另一个选择是在保持do关键字的同时省略in。他们还注意到你也可以把它写成

runTests = mapM (print . testListExpr) testLispText

并且真的让事情变得干净

© www.soinside.com 2019 - 2024. All rights reserved.