【发布时间】:2016-03-07 22:14:53
【问题描述】:
我经常读到我不应该在 Haskell 中混合使用制表符和空格,或者根本不应该使用制表符。为什么?
【问题讨论】:
标签: haskell syntax whitespace indentation
我经常读到我不应该在 Haskell 中混合使用制表符和空格,或者根本不应该使用制表符。为什么?
【问题讨论】:
标签: haskell syntax whitespace indentation
问题是双重的。首先,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' 与空格的绑定并最终导致解析器错误。
如果您在整个代码中强制执行代码约定,确保您只在行首使用制表符并在where、let 或do 之后使用换行符,则可以避免一些问题(见11)。但是,GHC warn about tabs by default 的当前版本,因为它们在过去有 have been a source of many 解析器错误,所以你可能也想摆脱它们。
【讨论】: