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