Zet*_*eta 27 syntax whitespace haskell indentation
我经常读到我不应该在Haskell中混合制表符和空格,或者我根本不应该使用制表符.为什么?
Zet*_*eta 34
问题是双重的.首先,Haskell是缩进敏感的,例如以下代码无效:
example = (a, b)
where
a = "Hello"
b = "World"
Run Code Online (Sandbox Code Playgroud)
两个绑定都需要使用相同数量的空格/制表符进行缩进(请参阅旁边规则).虽然在这种情况下显而易见,但它隐藏在下面的一个中,其中我表示一个空格·和一个标签»:
example = (a, b)
··where
····a = "Hello"
» b = "World"
Run Code Online (Sandbox Code Playgroud)
如果编辑器将显示与四倍对齐的选项卡,这将看起来像有效的Haskell代码.但事实并非如此.Haskell选项卡以8的倍数对齐,因此代码将按如下方式解释:
example = (a, b)
··where
····a = "Hello"
» b = "World"
Run Code Online (Sandbox Code Playgroud)
其次,如果仅使用选项卡,则最终可能会出现看起来不正确的布局.例如,如果显示的选项卡包含六个或更多空格(在本例中为八个),则以下代码看起来是正确的:
example = (a, b)
» where» a = "Hello"
» » b = "World"
Run Code Online (Sandbox Code Playgroud)
但在另一个使用4个空格的编辑器中,它看起来不再正确:
example = (a, b)
» where» a = "Hello"
» » b = "World"
Run Code Online (Sandbox Code Playgroud)
但它仍然是正确的.但是,习惯于空格的人可能会重新加入b与空格的绑定并最终导致解析器错误.
如果在整个代码中强制执行代码约定,以确保只在行的开头使用制表符并在之后使用换行符where,let或者do可以避免一些问题(参见11).然而,当前版本的GHC警告默认标签,因为他们已经 被 一个 源 的 许多过去分析器错误,所以你可能希望太摆脱他们.