让:
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
为什么?中缀值构造函数的固定性是否默认为最低?
答案 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 y
和0
之间的优先顺序。 9
运算符的优先级高于*
,这意味着+
被解释为2 + 3 * 2
,而不是 。如引用部分所述,如果 not 指定优先级,则它是最高的。所以2 + (3 * 2)
(2 + 3) * 2
有些1 + id 2
被解释为id 3 * 5
(但这没有任何意义,因为我们无法将1 + (((id 2) `Some` (id 3)) * 5)
对象与Some
相乘。
所以你的表达:
5
相当于:
id 1 `Some` id 2