【发布时间】:2017-06-22 16:06:05
【问题描述】:
为什么右结合运算符在泛型类型的函数中存在问题,即使等效的左结合运算符工作得很好。
implicit class FunctionWrapper[T1, T2](func: T1 => T2) {
def >>>[T3](funcAfter: T2 => T3): T1 => T3 = {
func andThen funcAfter
}
def >>:[T0](funcBefore: T0 => T1): T0 => T2 = {
funcBefore andThen func
}
}
以下是要链接的函数:
def intToFloat = Int.int2float _
def floatToString = (_: Float).toString
def identityF[T] = identity(_: T)
正如预期的那样,这两个运算符都适用于具体类型的函数:
scala> (intToFloat >>> floatToString)(11)
res5: String = 11.0
scala> (intToFloat >>: floatToString)(11)
res6: String = 11.0
但是,由于某种原因,>>: 使用泛型函数失败:
scala> (intToFloat >>> identityF >>> floatToString)(11)
res7: String = 11.0
scala> (intToFloat >>: identityF >>: floatToString)(11)
<console>:16: error: type mismatch;
found : Nothing => Nothing
required: T0 => Float
(intToFloat >>: identityF >>: floatToString)(11)
^
有一些解决方法,一个是
(intToFloat >>: (identityF (_: Float)) >>: floatToString)(11)
但是在给定的上下文中推断 identityF 的类型似乎很容易,为什么它会失败?
【问题讨论】:
标签: scala generics functional-programming type-inference