【问题标题】:What is wrong with this Haskell let-in indentation?这个 Haskell 缩进有什么问题?
【发布时间】:2015-04-11 12:05:56
【问题描述】:

在下面的 Haskell 代码中,我收到一个错误“输入 'in' 上的解析错误”。根据我的阅读,我使用的缩进应该没问题。事实上,我在代码的其他地方成功地使用了具有类似缩进的 'let' 和 'in'('let' 与 'in' 对齐)。我打破了什么规则导致这个“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

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

【问题讨论】:

  • 顺便说一下,这相当于runTests = mapM_ (print . testLispExpr) testLispText

标签: haskell syntax indentation let do-notation


【解决方案1】:

do 块中的let 语法有点搞笑。如果要使用in,则必须将其缩进到let 的右侧。或者,您可以完全省略 inlet 绑定将在 do 块的其余部分可见:

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

编辑

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

runTests = mapM (print . testListExpr) testLispText

真正让事情变得干净。

【讨论】:

  • 第三种选择是跳过do,因为只有一个语句。
  • 一开始很小(跳过/省略),最后得到了一个非常冗长的编辑......对不起。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-15
  • 1970-01-01
  • 2012-05-26
  • 2021-08-20
  • 2015-09-23
  • 2021-02-27
相关资源
最近更新 更多