我正在尝试为自己验证有关 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 消费。