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