为什么我不应该混合标签和空格?

时间:2016-03-07 22:14:54

标签: haskell syntax whitespace indentation

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

1 个答案:

答案 0 :(得分:30)

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

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

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

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

如果编辑器将显示与4的倍数对齐的选项卡,这将看起来像有效的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解析器错误,所以你可能也想摆脱它们。

另见