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
不太新。請參閱http://stackoverflow.com/questions/2922347/operator-precedence-in-scala –
@Łukasz - 我沒有考慮運營商的優先權。受到超載問題的困擾,這導致我考慮操作員關聯性。所以這就是我需要的解釋:#具有更高的優先權! (根據您提供的鏈接)。那麼你能否做出答案,以便我可以將其標記爲正確的答案? TIA。 – user2051561