作为语法运算符的反引号

刚刚遇到了一件对我来说似乎很陌生的东西。反引号的功能类似于句法操作符。作为语法运算符的反引号

applyOp :: Int -> (Int -> Int -> Int) -> Int -> Int 

applyOp x op y = x `op` y

> applyOp 2 (+) 5

7

我很惊讶地看到这一点。我一直认为反引号需要包围一个运营商符号或标识符,而不是一个可以在执行过程中绑定到运营商的标识符。我在想这个错误的方式吗?

回答:

反引号是将标识符变成中缀运算符的语法糖。也就是说,a `f` b = f a b是一般重写规则。这对清晰起见很有用,但也可以避免使用过多的括号,因为f (a b) (c d)可以重写为a b `f` c d

但也有使用这些几个注意事项,但只有两个限制:

  • 的backticked表达必须是一个标识符,所以1 `mod` 2是有效的,但a `zipWith (+)` b是无效的,因为它涉及功能应用程序。

  • 只有字母数字标识符可以backticked,所以1 `mod` 2是有效的,但1 `(+)` 2是无效的。您可以将此视为上一个限制的应用。

  • Backticked词汇具有优先级如图9所示,并且是左结合,所以a `f` b `f` c被解析为(a `f` b) `f` c,和其他一般运营商将inlcude它,所以a + c `f` b被解析为a + (c `f` b) *

在这种情况下,applyOp x op y = x `op` y是有效的,因为op是字母数字标识符,这相当于applyOp x op y = op x y。请注意,对绑定模式匹配标识符有限制没有


*这是不真实的标准前奏运营商!!.。有关优先级和固定性的更多信息,请参阅The Haskell 98 Report。

以上是 作为语法运算符的反引号 的全部内容, 来源链接: utcz.com/qa/257755.html

回到顶部