函数应用的优先级

And*_*ler 3 haskell operator-precedence

为了说明函数应用程序在 Haskell 中具有最高优先级,提供了以下示例(由 schoolofhaskell 提供):

sq b = b * b
main = print $
-- show
    sq 3+1 
-- /show
Run Code Online (Sandbox Code Playgroud)

这里的结果是 10。

让我困惑的是,这个参数也构成了一个函数应用。将运算符+视为函数的快捷方式。因此,当采用该参数时,我希望它的函数应用程序现在优先于原始函数应用程序。

这样写就可以达到预期的结果:

sq b = b * b
main = print $
    sq ((+) 3 1 )
Run Code Online (Sandbox Code Playgroud)

有什么解释吗?

Dan*_*ner 5

让我困惑的是,这个参数也构成了一个函数应用。将运算符“+”视为函数的快捷方式。

我认为这就是这里涉及的误解的核心(实际上,很好的理解!)。确实是一个表达式,表示函数对3 + 1的应用,您已经正确理解了。然而,Haskell 有两种函数应用语法,前缀中缀。因此,“函数应用程序具有最高优先级”的更精确版本将类似于“语法前缀函数应用程序比任何语法中缀函数应用程序具有更高的优先级”。(+)31

您还可以在两种形式之间来回转换。每个函数都有一个“自然”位置:仅包含符号的名称在语法上自然是中缀,而包含字母和数字等的名称在语法上自然是前缀。您可以将自然前缀函数转换为带有反引号的中缀,并将自然中缀函数转换为带有括号的前缀。所以,如果我们定义

plus = (+)
Run Code Online (Sandbox Code Playgroud)

那么以下所有内容实际上都意味着同一件事:

3 + 1
3 `plus` 1
(+) 3 1
plus 3 1
Run Code Online (Sandbox Code Playgroud)

回到你的例子:

sq 3+1
Run Code Online (Sandbox Code Playgroud)

因为sq是 自然前缀,并且+自然是中缀,所以sq应用程序优先。