为什么可以';我链接了几个Scala中缀方法调用

为什么可以';我链接了几个Scala中缀方法调用,scala,infix-operator,Scala,Infix Operator,我正在研究DSL,在使用方法作为链中的中缀运算符时遇到了一个问题。我将尝试用一些代码来解释它。我有一个traitTerm和case类Literal和Variable扩展它。我想使用一些操作符构造一个术语实例列表 case class Expr(val terms: List[Term]) { def +(v: String) = Expr(Literal(v) :: terms) def -->(func: List[String] => List[String]) = term

我正在研究DSL,在使用方法作为链中的中缀运算符时遇到了一个问题。我将尝试用一些代码来解释它。我有一个trait
Term
和case类
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>)))
案例类表达式(val术语:列表[术语]){
def+(v:String)=Expr(文字(v)::术语)
def-->(func:List[String]=>List[String])=术语匹配{
大小写文字(v)::ts=>Expr(变量(v,func)::ts)
case=>抛出新异常(“只能对文本应用函数”)
}
}
对象foo{
定义栏(名称:字符串)=Expr(文字(名称)::Nil)
}
//一些功能
val one=。。。
val all=。。。
//工作
富吧“x”
//res1:Expr=Expr(列表(文本(x)))
//行不通
foo-bar“x”-->全部
//错误:值-->不是java.lang.String的成员
//工作
(foo-bar“x”)-->all
//res1:Expr=Expr(列表(变量(x,))

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

您可以在这里找到运算符优先级

根据第一个答案,
-
比字母具有更高的优先级。所以编译器组的表达式如下所示:

foo bar ("x" --> all)
如果将
-->
替换为优先级较低的内容(例如字母),则应编译它。例如:

foo bar "x" to all
您也可以选择更高优先级的运算符,而不是
bar
。类似于
~~>
的内容将执行此操作,因为
~
是特殊字符,具有最高优先级:

foo ~~> "x" --> all

谢谢我想把操作符看作方法让我忘记了它们可以有优先权。