非字母数字运算符名称会导致编译错误



只要使用字母数字命名运算符pipertapper,一切都很好。(旁注:从Scala 2.13的管道和水龙头复制)

package playground
object NonAlphaOperatorName {
implicit final class MyChainingOps[A](private val me: A) extends AnyVal {
def piper[B](f: A => B): B = f(me)
def tapper[B](f: A => B): A = {
f(me)
me
}
}
def main(args: Array[String]): Unit = {
100 piper
(r => r + 1) piper
(r => r + 5) tapper
(r => println(s"...$r...")) piper
println
}
}

问题:当我piper重命名为|>时,我得到一个编译器错误";缺少参数类型";。

(旁注:另一方面,将piper重命名为__(双下划线)也可以)

package playground
object NonAlphaOperatorName {
implicit final class MyChainingOps[A](private val me: A) extends AnyVal {
def |>[B](f: A => B): B = f(me)
def tapper[B](f: A => B): A = {
f(me)
me
}
}
def main(args: Array[String]): Unit = {
100 |>
(r => r + 1) |>
(r => r + 5) tapper
(r => println(s"...$r...")) |>    //error: missing parameter type [17:8]
println
}
}

你能帮我解释一下这个问题吗?Scala2.13中有解决这个问题的方法吗?

在两个示例中,运算符的优先级不同。

在第一个例子中,pipertapper都具有相同的优先级,因此该代码等效于下面的全括号和"0";虚线";版本:

100.piper(r => r + 1).piper(r => r + 5).tapper(r => println(s"...$r...")).piper(println)

在第二个例子中,|>的优先级高于tapper,因此该代码等效于下面的全括号和"0";虚线";版本:

100.|>(r => r + 1).|>(r => r + 5).tapper((r => println(s"...$r...")).|>(println))

最新更新