【问题标题】:Why shouldn't I mix tabs and spaces?为什么我不应该混合制表符和空格?
【发布时间】:2016-03-07 22:14:53
【问题描述】:

我经常读到我不应该在 Haskell 中混合使用制表符和空格,或者根本不应该使用制表符。为什么?

【问题讨论】:

    标签: haskell syntax whitespace indentation


    【解决方案1】:

    问题是双重的。首先,Haskell 对缩进敏感,例如以下代码无效:

    example = (a, b)
      where
        a = "Hello"
         b = "World"
    

    两个绑定都需要缩进相同数量的空格/制表符(请参阅off-side rule)。虽然在这种情况下很明显,但它在下面的例子中相当隐藏,我用· 表示一个空格,用» 表示一个制表符:

    example = (a, b)
    ··where
    ····a = "Hello"
    »   b = "World"
    

    如果编辑器将显示以四倍数对齐的选项卡,这将看起来像有效的 Haskell 代码。但事实并非如此。 Haskell 选项卡以 8 的倍数对齐,所以代码会这样解释:

    example = (a, b)
    ··where
    ····a = "Hello"
    »       b = "World"
    

    其次,如果您只使用选项卡,您最终可能会得到一个看起来不正确的布局。例如,如果选项卡显示有六个或更多空格(在本例中为八个),则以下代码看起来是正确的:

    example = (a, b)
    »       where»  a = "Hello"
    »       »       b = "World"
    

    但在另一个使用 4 个空格的编辑器中,它看起来不再正确:

    example = (a, b)
    »   where»  a = "Hello"
    »   »   b = "World"
    

    不过,它仍然是正确的。但是,习惯使用空格的人可能会重新缩进 b' 与空格的绑定并最终导致解析器错误。

    如果您在整个代码中强制执行代码约定,确保您只在行首使用制表符并在whereletdo 之后使用换行符,则可以避免一些问题(见11)。但是,GHC warn about tabs by default 的当前版本,因为它们在过去有 have been a source of many 解析器错误,所以你可能也想摆脱它们。

    另见

    【讨论】:

      猜你喜欢
      • 2011-03-28
      • 2011-04-04
      • 2019-02-15
      • 1970-01-01
      • 2023-03-30
      • 2012-04-17
      • 2010-09-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多