固定声明
为了解析涉及运算符和函数的表达式,Haskell 使用 fixity 声明来确定括号的位置。按顺序,它
- 在 parens 包装功能应用程序
- 使用绑定优先级来包装所有由相同优先级的运算符分隔的术语组
- 使用这些运算符的关联性来确定如何将 parens 添加到这些组
请注意,我们在此假设步骤 2 中任何给定组中的运算符必须具有相同的关联性。实际上,Haskell 将拒绝任何不满足此条件的程序。
作为上述算法的一个例子,我们可以逐步通过向 1 + negate 5 * 2 - 3 * 4 ^ 2 ^ 1
添加括号的过程。
infixl 6 +
infixl 6 -
infixl 7 *
infixr 8 ^
1 + (negate 5) * 2 - 3 * 4 ^ 2 ^ 1
1 + ((negate 5) * 2) - (3 * (4 ^ 2 ^ 1))
(1 + ((negate 5) * 2)) - (3 * (4 ^ (2 ^ 1)))
有关 Haskell 98 报告的第 4.4.2节中的更多详细信息。