【问题标题】:violation of Haskell indentation rules for if-then-else违反 if-then-else 的 Haskell 缩进规则
【发布时间】:2018-02-19 02:59:16
【问题描述】:

根据Haskell indentation rules,“作为某个表达式一部分的代码应该比该表达式的开头缩进更多”。但是,我发现以下示例似乎违反了上述规则,编译时没有任何错误或警告:

someFunction :: Bool -> Int -> Int -> Int
someFunction condition a b = if condition
then a - b
      else a + b

这里我定义了一个函数someFunction,它的主体是一个if-then-else 块。根据缩进规则,then 块是第一行中同一表达式的一部分,因此它应该比前一行缩进更多。然而在我的示例中,第二行 then 与第一行在同一列开始,并且此示例编译。

我不确定这里发生了什么。我正在使用 GHC 版本 8.0.1。

【问题讨论】:

    标签: haskell


    【解决方案1】:

    我有理由确定这是deliberate GHC variation on the indentation rule 的产物。不错的收获!

    GHC 读取此内容

    foo = do
      item
      if a
      then b
      else c
      item
    

    作为

    foo = do {
      item ;
      if a ;
      then b ;
      else c ;
      item }
    

    应该会触发解析错误。

    但是,这种情况非常普遍,以至于 GHC 开发人员在某个时候决定在 thenelse 之前允许可选的 ;。对if 语法的这种更改使代码可以编译。

    这意味着if 变得“特殊”,因为它不必缩进更多,而与前一项一样多。在问题中发布的代码中,then 与前一项一样缩进,因此在它之前有一个隐含的;,这使得代码可以编译。

    不过,我仍然会尽量避免这种“风格”,因为它很古怪。

    (就我个人而言,我不会将这种特殊情况添加到 GHC 中。但这没什么大不了的。)

    我现在注意到 Wikibook 提到这个变体是对 Haskell 未来版本的“提议”。这现在有点过时了,从那时起就在 GHC 中实现了。

    【讨论】:

    • 在命令式代码中我只能忍受if cond then\n foo\nelse\n bar 风格的审美,其他的让我抓狂。谢谢 GHC 伙计们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-15
    • 1970-01-01
    相关资源
    最近更新 更多