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}