中缀值构造函数的固定性

时间:2018-01-06 21:09:23

标签: haskell

让:

data Some a b = Some a b deriving (Show)

然后(在ghci中):

> Some (id 1) (id 2)
Some 1 2

但(并不奇怪):

> Some id 1 id 2
Couldn't match expected type ‘(a1 -> a1) -> Integer -> t’ ...

然而:

> id 1 `Some` id 2
Some 1 2

为什么?中缀值构造函数的固定性是否默认为最低?

1 个答案:

答案 0 :(得分:2)

构造函数也是一个函数:我们可以使用构造函数C作为一个函数,它接受构造函数将作为参数保存的参数,然后构造该类型的新实例。因此,在您的示例中,Haskell在语法上看到Some,就像它看到任何函数一样。

如果你在反引号(`)之间写一个函数,那么它就像一个运算符,就像它写在Section 3 of the Haskell '98 report中一样:

  

运算符可以是运算符号,例如+$$,也可以是普通标识符,包含在严重重音(反引号)中,例如{{1 }}。例如,可以编写中缀应用程序`op`,而不是编写前缀应用程序op x y如果没有为x `op` y提供固定声明,则默认为最高优先级和左关联

该部分还描述了功能应用程序优先于运营商。我们看到表达式`op`可以是exp(函数应用程序表达式)。这种函数应用程序的参数是fexp s。 aexp 可以包含运算符(通过aexp),但仅在括号(exp)之间,方括号(() ,当我们构建一个列表),等等但不是没有优先权的规范。如果我们写:[],则将其解释为f a b + g x a,将 解释为 (f a b) + (g x y)

现在唯一仍然开放的问题是,如果表达式包含其他运算符,会发生什么。在Haskell中,我们为运算符分配优先级(和associativty)。这在Section 4 of the Haskell '98 report中有所描述。所有运营商都分配了f a (b+g) x y0之间的优先顺序。 9运算符的优先级高于*,这意味着+被解释为2 + 3 * 2,而不是 2 + (3 * 2) 。如引用部分所述,如果 not 指定优先级,则它是最高的。所以(2 + 3) * 2有些1 + id 2被解释为id 3 * 5(但这没有任何意义,因为我们无法将1 + (((id 2) `Some` (id 3)) * 5)对象与Some相乘。

所以你的表达:

5

相当于:

id 1 `Some` id 2