问题是双重的。首先,Haskell 对缩进敏感,例如以下代码无效:
example = (a, b)
where
a = "Hello"
b = "World"
两个绑定都需要缩进相同数量的空格/制表符(请参阅越位规则 https://en.wikipedia.org/wiki/Off-side_rule)。虽然在本例中很明显,但在下一个例子中它相当隐藏,我用以下方式表示空格·
和一个选项卡»
:
example = (a, b)
··where
····a = "Hello"
» b = "World"
如果编辑器显示按 4 的倍数对齐的制表符,这将看起来像有效的 Haskell 代码。但事实并非如此。 Haskell 制表符按八的倍数对齐,因此代码将被解释如下:
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
or do
您可以避免一些问题(请参阅11 http://dmwit.com/tabs/)。然而,当前版本的GHC 默认警告选项卡 https://downloads.haskell.org/ghc/latest/docs/html/users_guide/using-warnings.html, 因为他们have https://stackoverflow.com/questions/35853689/parse-error-on-input-function-haskell been https://stackoverflow.com/questions/35060673/parse-error-in-nested-if-do-blocks a https://stackoverflow.com/questions/33480140/parse-error-in-pattern-putstrln-possibly-caused-by-a-missing-do source https://stackoverflow.com/questions/24842552/haskell-parse-error-on-input of https://stackoverflow.com/questions/24372766/parse-error-in-valid-code many https://stackoverflow.com/questions/16870038/haskell-syntax-error-for-where-statement过去的解析器错误,因此您可能也想摆脱它们。
See also
-
关于该主题的 Reddit 主题 https://www.reddit.com/r/haskell/comments/15gz8q/a_nondirty_shot_at_tabs_vs_spaces/(大多数专业空间,但也有一些专业选项卡)
-
良好的哈斯克尔风格 http://urchin.earth.li/%7Eian/style/haskell.html(专业空间)
-
又一场标签与空间的争论 http://dmwit.com/tabs/(专业混音)