Scala operator #> 导致编译错误但不是 and> - 为什么?
Scala operator #> causes compilation error but not &> - why?
我遇到类型推断问题并寻求帮助 。
最初的问题是由于过载。一旦纠正我
仍然有问题。
代码如下:
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}
,这确实是一个
双倍的。
但是,如果我使用“&>”运算符,则不会发生错误。在里面
下面测试代码,直接翻一下注释。所以我的问题是,为什么
这是在发生吗?这是 Scala 2.12.0 的新功能吗?
TIA
问题出在运算符优先级上。以下是更多详细信息: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}
我遇到类型推断问题并寻求帮助
代码如下:
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}
,这确实是一个
双倍的。
但是,如果我使用“&>”运算符,则不会发生错误。在里面 下面测试代码,直接翻一下注释。所以我的问题是,为什么 这是在发生吗?这是 Scala 2.12.0 的新功能吗?
TIA
问题出在运算符优先级上。以下是更多详细信息: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}