固定声明

为了解析涉及运算符和函数的表达式,Haskell 使用 fixity 声明来确定括号的位置。按顺序,它

  1. 在 parens 包装功能应用程序
  2. 使用绑定优先级来包装所有由相同优先级的运算符分隔的术语组
  3. 使用这些运算符的关联性来确定如何将 parens 添加到这些组

请注意,我们在此假设步骤 2 中任何给定组中的运算符必须具有相同的关联性。实际上,Haskell 将拒绝任何不满足此条件的程序。

作为上述算法的一个例子,我们可以逐步通过向 1 + negate 5 * 2 - 3 * 4 ^ 2 ^ 1 添加括号的过程。

infixl 6 +
infixl 6 -
infixl 7 *
infixr 8 ^
  1. 1 + (negate 5) * 2 - 3 * 4 ^ 2 ^ 1
  2. 1 + ((negate 5) * 2) - (3 * (4 ^ 2 ^ 1))
  3. (1 + ((negate 5) * 2)) - (3 * (4 ^ (2 ^ 1)))

有关 Haskell 98 报告的4.4.2节中的更多详细信息。