0

我有一个类型推断问题,并要求帮助here。 最初的问题是由于过载。一旦纠正我 仍然有问题。Scala运算符#>导致编译错误,但不是&> - 为什么?

所以这里是代码:

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} 
             ^

请注意,在第二个最后的代码行中,我只需要添加 括号来强制执行左侧手关联性 (Scala默认)。这似乎是#>运营商试图 使用功能{x : Double => x/0.0},这确实是一个 Double。

但是,如果我使用“&>”运算符,则不会发生错误。在下面的 测试代码中,只需翻转评论即可。所以我的问题是,为什么 是这样的发生。这是Scala 2.12.0的新东西吗?

TIA

+1

不太新。请参阅http://stackoverflow.com/questions/2922347/operator-precedence-in-scala –

+0

@Łukasz - 我没有考虑运营商的优先权。受到超载问题的困扰,这导致我考虑操作员关联性。所以这就是我需要的解释:#具有更高的优先权! (根据您提供的链接)。那么你能否做出答案,以便我可以将其标记为正确的答案? TIA。 – user2051561

回答

2

问题在于运算符的优先级。这里有更多的细节: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}