我正在尝试自己验证Haskell中的操作符和函数优先级。例如,以下代码:
list = map foo $ xs
可以重写为
list = (map foo) $ (xs)
最终会
list = map foo xs
我的问题曾经是,为什么第一个表述不能重写为
list = (map foo $) xs
因为函数优先级始终高于运算符优先级,但我认为我已经找到了答案:运算符简单地不允许作为函数的参数(当然,如果您用括号将它们括起来,则可以)。是这样吗?如果是这样,我觉得很奇怪,在RWH或Learn you a Haskell或其他我搜索过的地方中都没有提到这个机制/规则。如果您知道有规定的地方,请提供链接。
-- 编辑:感谢您的快速回答。我想我的困惑来自于认为运算符文字会以某种方式求值为可由函数作为参数消耗的内容。记得将中缀运算符机械地翻译为前缀函数对我很有帮助。将其应用于第一个公式的结果为
($) (map foo) (xs)
毫无疑问,($)是消耗函数,并且由于两种表达式是等价的,因此在第一个表达式中的$文字不能被map函数消耗。
$
分成如下部分:((map foo) $) xs
。当然,这有点傻,因为它等同于(map foo) $ xs
,而(map foo) $ xs
又等同于map foo $ xs
。 - Gabriel L.(map foo $) xs = (map foo $ xs) = map foo xs = ($) (map foo) xs
可以翻译为:(map foo $)xs =(map foo $ xs)= map foo xs =($)(map foo)xs
。 - Will Ness