我正在尝试为自己验证一些关于 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 消耗。
首先,应用程序(空格)是优先级最高的“运算符”。
其次,在 Haskell 中,运算符和函数之间实际上没有区别,只是运算符默认为中缀,而函数则不然。您可以使用反引号将函数转换为中缀
2 `f` x
并将运算符转换为带括号的前缀:
(+) 2 3
所以,你的问题有点混乱。
现在,特定函数和运算符将具有声明的优先级,您可以在 GHCi 中使用“:info”找到它们:
Prelude> :info ($)
($) :: (a -> b) -> a -> b -- Defined in GHC.Base
infixr 0 $
Prelude> :info (+)
class (Eq a, Show a) => Num a where
(+) :: a -> a -> a
infixl 6 +
显示优先级和关联性。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)