为什么我不能链接几个Scala中缀方法调用

我正在研究DSL,我遇到了使用方法作为链中的中缀运算符的问题.我将尝试用一些代码来解释它.我有一个特性术语和案例类Literal和Variable扩展它.我想使用一些运算符构造一个术语实例列表.

case class Expr(val terms: List[Term]) {
 def +(v: String) = Expr(Literal(v) :: terms)
 def -->(func: List[String] => List[String]) = terms match {
  case Literal(v) :: ts => Expr(Variable(v, func) :: ts)
  case _ => throw new Exception("Can only apply function on literal")
 }
}

object foo {
 def bar(name: String) = Expr(Literal(name) :: Nil)
}

// some functions
val one = ... 
val all = ...

// works
foo bar "x"        
// res1: Expr = Expr(List(Literal(x)))

// works not
foo bar "x" --> all
// error: value --> is not a member of java.lang.String

// works
(foo bar "x") --> all 
// res1: Expr = Expr(List(Variable(x,<function1>)))

我希望这相当于foo.bar(“x”).–>(全部),但解释器似乎将其视为foo.bar(“x”.–>(all)).

您可以在此处找到运算符优先级:

Operator precedence in Scala

根据第一个答案 – 与字母相比具有更高的优先级.所以编译器组表达式如下:

foo bar ("x" --> all)

如果你要替换 – >如果优先级较低(例如字母),则应编译.例如:

foo bar "x" to all

您也可以选择更高优先级的运算符而不是bar.像~~>之类的东西会这样做,因为〜是特殊字符,它具有最高优先级:

foo ~~> "x" --> all
翻译自:https://stackoverflow.com/questions/5904038/why-cant-i-chain-several-scala-infix-method-calls

转载注明原文:为什么我不能链接几个Scala中缀方法调用