Scala 运算符 #> 导致编译错误,但不是 &> - 为啥?

Posted

技术标签:

【中文标题】Scala 运算符 #> 导致编译错误,但不是 &> - 为啥?【英文标题】:Scala operator #> causes compilation error but not &> - why?Scala 运算符 #> 导致编译错误,但不是 &> - 为什么? 【发布时间】:2017-04-08 21:03:00 【问题描述】:

我遇到了类型推断问题并寻求帮助 here。 最初的问题是由于过载。一旦纠正我 仍然有问题。

代码如下:

class DPipe[ A ]( a: A ) 
  def !>[ B ]( f: A => B ) = Try(f( a ))
  def #>[ B, C ]( f: B => C )(implicit ev: A =:= Try[B]) : Try[C] = a.map(f)
  //def &>[ B, C ]( f: B => C )( implicit ev: A =:= Try[ B ] ) =  a.map( f )


object DPipe 
  def apply[ A ]( v: A ) = new DPipe( v )


object DPipeOps 
  implicit def toDPipe[ A ]( a: A ): DPipe[ A ] = DPipe( a )

这里是测试:

object DPipeDebug 

 def main( args: Array[ String ] ) 

    import DPipeOps._

    val r8 = 100.0 !> x : Double => x / 0.0  
    println(r8)
    val r9 = r8 #> x:Double => x* 3.0 
    println(r9)
    /*
    val r8 = 100.0 !>  x: Double => x / 0.0 
    println( r8.get )
    val r9 = r8 &>  x: Double => x * 3.0 
    println( r9 )*/

    val r10 = (100.0 !> x : Double => x / 0.0) #> x:Double => x* 3.0 
   //val r10 = ( 100.0 !>  x: Double => x / 0.0  ) &>  x: Double => x * 3.0 

    val r11 = 100.0 !> x : Double => x / 0.0 #> x:Double => x* 3.0 
    //val r11 = 100.0 !>  x: Double => x / 0.0  &>  x: Double => x * 3.0     
  


就目前而言,我们在最后一行代码中有以下错误:

Cannot prove that Double => Double =:= scala.util.Try[Double].
val r11 = 100.0 !> x : Double => x / 0.0 #> x:Double => x* 3.0 
                                           ^

请注意,在倒数第二行代码中,我只需要添加 强制左左结合性的括号 (斯卡拉默认)。似乎#> 运营商试图 使用函数x : Double => x / 0.0,这确实是一个 双倍的。

但是,如果我使用“&>”运算符,则不会发生错误。在里面 下面的测试代码,只需翻转 cmets。所以我的问题是,为什么 这发生了吗?这是 Scala 2.12.0 的新功能吗?

TIA

【问题讨论】:

不是那么新。见***.com/questions/2922347/… @Łukasz - 我没有考虑运算符优先级。被导致我考虑运算符关联性的过载问题蒙蔽了双眼。所以这就是我需要的解释:# 的优先级高于 ! (根据您提供的链接)。那么你能把它作为一个答案,以便我可以将它标记为正确的吗? TIA。 【参考方案1】:

问题在于运算符优先级。以下是更多详细信息:Operator precedence in Scala

这取决于运算符的第一个字符。 # 的优先级高于 !! 的优先级高于 &

因此你得到

100.0 !> (x : Double => x / 0.0 #> x:Double => x* 3.0)

而不是

(100.0 !> x : Double => x / 0.0) #> x:Double => x* 3.0

【讨论】:

以上是关于Scala 运算符 #> 导致编译错误,但不是 &> - 为啥?的主要内容,如果未能解决你的问题,请参考以下文章

scala中常用但不常见(其他语言)的符号含义

Scala 类型系统的优点

Json.obj Scala,字符串连接:编译错误

由于找不到依赖项而导致编译Scala程序失败

Scala:编译错误:方法重载

Keil> 编译器特有的功能 > 关键字和运算符 > __weak