【发布时间】:2015-11-22 16:53:18
【问题描述】:
假设我有两个特征:
trait Generic1[T] {
def mapR[U](f: Result[T] => Result[U]): Generic1[U]
}
trait Generic2[A, T] {
// pretty much the same as Generic1, but with the extra `A` type param
def mapR[U](f: Result[T] => Result[U]): Generic2[A, U]
}
有没有一种方法可以定义一个单一的特征来定义基于mapR 方法的一些常见功能?
// for example
trait MapR[T, ???] {
def mapR[U](f: Result[T] => Result[U]): ???[U]
def map[U](f: T => U): ???[U] = mapR(_ map f)
def flatMap[U](f: T => Result[U]): ???[U] = mapR(_ flatMap f)
def withFilter(f: T => Boolean): ???[T] = mapR(_ withFilter f)
}
如何在上面的 MapR 特征中定义 ??? 以便我可以定义
trait Generic1[T] extends MapR[T, ???]
trait Generic2[A, T] extends MapR[T, ???]
额外问题
@m-z 的回答处理了上面提出的问题,但是当 GenericN 特征具有类型差异时,我遇到了一些进一步的麻烦:
trait Generic1[+T] extends MapR[T] {
type R[X] = Generic1[X]
...
}
trait Generic2[-A, +T] extends MapR[T] {
type R[X] = Generic2[A, X]
...
}
我收到类似“逆变类型 A 出现在类型 R 的类型 [X]Generic2[A, X] 的不变位置”之类的错误
我尝试将 R 重新定义为协变,但它仍然没有触及 A 类型,并且我得到了类似的错误。
可以调整答案中的方法来处理上述类型差异吗?
【问题讨论】: