Scala 如何创建具有优先级的自定义运算符

Scala 如何创建具有优先级的自定义运算符,scala,Scala,我有一个自定义运算符的类 case class Num(var value:Int) { def add(x:Num) = Num(value + x.value) def mul(x:Num) = Num(value * x.value) } 所以我可以这样称呼他们 val a = Num(2) val b = Num(3) val c = Num(4) val m1 = a add b mul c 但是如何在添加之前执行mul?我看到了一个类似于+|的解决方案,而不是

我有一个自定义运算符的类

case class Num(var value:Int) {
    def add(x:Num) = Num(value + x.value)
    def mul(x:Num) = Num(value * x.value)
  }
所以我可以这样称呼他们

val a = Num(2)
val b = Num(3)
val c = Num(4)
val m1 = a add b mul c

但是如何在添加之前执行
mul
?我看到了一个类似于
+|
的解决方案,而不是
add
,但我希望在操作符中包含字母,并且
+add
*mul
不起作用。此外,我还想包括一个
pow
函数,因此这需要比
mul

更高的精度,您可以在add之后使用括号

val m1 = a add (b mul c) = 14
val m1 = a add b mul c = 20
更新

在命名方法时没有任何限制。例如,可以为类定义方法+、-、*等

case class Num(var value:Int) {
    def + (x:Num) = Num(value + x.value)
    def *(x:Num) = Num(value * x.value)
  }

  object Num  extends App {
    val a = Num(2)
    val b = Num(3)
    val c = Num(4)
    val m1 = a + b * c
    println(m1)

}
输出

Num(14)

是的,但在较长的表达式中,这看起来不好。有没有一种方法可以用操作符来实现这一点?问题是,如果我不这样命名函数,例如mul而不是*,那么输出将是20将函数名定义为
*
+
而不是
mul
add
。我想添加像pow、integral和root这样的函数。为此,我也需要优先级。在Scala参考-6.12.3中缀操作中,运算符优先级由运算符中的第一个字符固定。