Haskell 为什么不应该';我不能混合制表符和空格吗?

Haskell 为什么不应该';我不能混合制表符和空格吗?,haskell,syntax,whitespace,indentation,Haskell,Syntax,Whitespace,Indentation,我经常读到,我不应该在Haskell中混合使用制表符和空格,或者根本不应该使用制表符。为什么?这个问题有两个方面。首先,Haskell对缩进敏感,例如,以下代码无效: example = (a, b) where a = "Hello" b = "World" 两个绑定都需要缩进相同数量的空格/制表符(请参阅)。虽然在本例中很明显,但它隐藏在下面的一个示例中,其中我用·表示一个空格,用»表示一个选项卡: example = (a,

我经常读到,我不应该在Haskell中混合使用制表符和空格,或者根本不应该使用制表符。为什么?这个问题有两个方面。首先,Haskell对缩进敏感,例如,以下代码无效:

example = (a, b)
  where
    a = "Hello"
     b = "World"
两个绑定都需要缩进相同数量的空格/制表符(请参阅)。虽然在本例中很明显,但它隐藏在下面的一个示例中,其中我用
·
表示一个空格,用
»
表示一个选项卡:

example = (a, b)
··where
····a = "Hello"
»   b = "World"
如果编辑器显示的选项卡以4的倍数对齐,那么这看起来就像是有效的Haskell代码。但事实并非如此。Haskell制表符以8的倍数对齐,因此代码的解释如下:

example = (a, b)
··where
····a = "Hello"
»       b = "World"
第二,如果只使用选项卡,最终可能会出现布局不正确的情况。例如,如果选项卡显示六个或更多空格(本例中为八个空格),则以下代码看起来是正确的:

但在另一个使用4个空格的编辑器中,它看起来不再正确:

example = (a, b)
»   where»  a = "Hello"
»   »   b = "World"
不过,这仍然是正确的。但是,习惯使用空格的人可能会重新破坏
b
”与空格的绑定,并最终导致解析器错误

如果在整个代码中强制执行代码约定,确保只在行首使用制表符,并在
where
之后使用换行符,
执行
,则可以避免一些问题(请参阅)。但是,的当前版本,因为它们解析了过去的错误,所以您可能也希望消除它们

另见
  • (大多数pro空格,但一些pro选项卡)
  • (专业空间)
  • (专业混音)

    • 问题有两个方面。首先,Haskell对缩进敏感,例如,以下代码无效:

      example = (a, b)
        where
          a = "Hello"
           b = "World"
      
      两个绑定都需要缩进相同数量的空格/制表符(请参阅)。虽然在本例中很明显,但它隐藏在下面的一个示例中,其中我用
      ·
      表示一个空格,用
      »
      表示一个选项卡:

      example = (a, b)
      ··where
      ····a = "Hello"
      »   b = "World"
      
      如果编辑器显示的选项卡以4的倍数对齐,那么这看起来就像是有效的Haskell代码。但事实并非如此。Haskell制表符以8的倍数对齐,因此代码的解释如下:

      example = (a, b)
      ··where
      ····a = "Hello"
      »       b = "World"
      
      第二,如果只使用选项卡,最终可能会出现布局不正确的情况。例如,如果选项卡显示六个或更多空格(本例中为八个空格),则以下代码看起来是正确的:

      但在另一个使用4个空格的编辑器中,它看起来不再正确:

      example = (a, b)
      »   where»  a = "Hello"
      »   »   b = "World"
      
      不过,这仍然是正确的。但是,习惯使用空格的人可能会重新破坏
      b
      ”与空格的绑定,并最终导致解析器错误

      如果在整个代码中强制执行代码约定,确保只在行首使用制表符,并在
      where
      之后使用换行符,
      执行
      ,则可以避免一些问题(请参阅)。但是,的当前版本,因为它们解析了过去的错误,所以您可能也希望消除它们

      另见
      • (大多数pro空格,但一些pro选项卡)
      • (专业空间)
      • (专业混音)