我正在尝试为自己验证Haskell中的运算符和函数优先级.例如,以下代码
list = map foo $ xs
Run Code Online (Sandbox Code Playgroud)
可以改写为
list = (map foo) $ (xs)
Run Code Online (Sandbox Code Playgroud)
并最终将成为
list = map foo xs
Run Code Online (Sandbox Code Playgroud)
我的问题曾经是,为什么第一个表述不会被重写为
list = (map foo $) xs
Run Code Online (Sandbox Code Playgroud)
因为函数优先级总是高于运算符优先级,但我认为我找到了答案:运算符根本不允许作为函数的参数(当然,除非用括号括起它们).这是正确的吗?如果是这样的话,我觉得很奇怪,在RWH中没有提到这个机制/规则或者学习一个Haskell,或者我搜索过的任何其他地方.因此,如果您知道规则所在的地方,请链接到该地址.
- 编辑:感谢您的快速解答.我认为我的困惑来自于认为运算符字母会以某种方式评估某些东西,这可能会被函数作为参数使用.它帮助我记住,一个中缀运算符可以机械地转换为前缀函数.对第一个配方这样做会产生
($) (map foo) (xs)
Run Code Online (Sandbox Code Playgroud)
毫无疑问,($)是消耗函数,并且由于两个公式是等价的,因此第一个公式中的$ literal不能被map使用.