我经常读到我不应该在Haskell中混合制表符和空格,或者我根本不应该使用制表符。为什么呢?
答案 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
'与空格绑定并最终出现解析器错误。
如果您在整个代码中强制执行代码约定,以确保您只在行的开头使用制表符并在where
,let
或do
之后使用换行符,则可以避免一些问题(见11)。但是,GHC warn about tabs by default的当前版本,因为他们have been a source of many解析器错误,所以你可能也想摆脱它们。