是否有类似于Haskell的$(美元符号)的Scala运算符?

时间:2011-07-27 10:43:03

标签: scala operators

有没有办法在Scala中强制运算符优先级,就像在Haskell中使用$?

一样

例如,在Haskell中,您有:

a b c = ((a b) c)

a $ b c = a (b c)

在Scala中有类似的方法吗?我知道Scala本身没有运算符,但有没有办法达到类似的效果?

3 个答案:

答案 0 :(得分:17)

可以使用implicits来实现类似的效果。例如: (未经测试,但应该是这样的)

object Operator {

  class WithOperator[T](that: T) {
    def &:[U](f: T => U) = f(that)
  }
  implicit def withOperator[T](that: T) = new WithOperator(that)

}

使用此系统,您不能使用名称$,因为名称需要以:(以修复关联性)结束,而美元是正常的标识符(不是运营商标识符),因此您不能拥有它与a的名称相同,除非你用下划线分隔它们。

那么,你如何使用它们?像这样:

val plusOne = (x: Int) => {x + 1}
plusOne &: plusOne &: plusOne &: 1

答案 1 :(得分:15)

中缀vs。符号通常以类似的方式用于控制优先级:

a b c d == a.b(c).d
a.b c d == a.b.c(d)
a b c.d == a.b(c.d)

Scala对中缀表示法中使用的运算符也有固定的优先顺序:

(all letters)
|
^
&
< >
= !
:
+ -
* / %
(all other special characters)

通常可以明确选择名称以利用此功能。例如,标准解析器库中的~^^

答案 2 :(得分:8)

Scalaz定义了一个“管道”运算符,它的工作方式类似,但有翻转参数。见switch function and object with scalaz' |>