如何使用 ((.).(.)) 中缀?

How to use ((.).(.)) infix?

众所周知:

((.).(.)) :: (b -> c) -> (a -> a1 -> b) -> a -> a1 -> c

我可以像这样使用这个复合运算符前缀样式:

((.).(.)) f g

但看来我不能像这样使用它的中缀:

f ((.).(.)) g

有没有办法在不定义另一个运算符或在包中使用预定义运算符的情况下使用这种中缀样式?

不,你不能。中缀运算符只能是

  • 一个实际命名的中缀。事实上,通常定义

    (.:) :: (c->d) -> (a->b->c) -> a->b->d
    (.:) = (.).(.)
    

    本地。

  • 反引号中的命名函数。

不,你不能。

haskell中只有两种中缀运算符:

  1. 作为一个或多个运算符符号的单个令牌。对于所有运算符符号,请阅读 What characters are permitted for haskell operators?
  2. 两个反引号之间的单个标识符。标识符是满足特定条件的令牌:请阅读https://www.haskell.org/onlinereport/haskell2010/haskellch2.html#x7-180002.4

所以 <$> 是合法的中缀运算符,`f`,但不是 `f x`。要测试某物是否是单个标记,请尝试 lex "YOUR_TOKEN"。这是一个很好的测试,但有三个例外(参考自the documentation of Prelude):

  • 限定名称处理不当
  • 八进制和十六进制数字不被识别为单个标记
  • 评论未得到妥善处理