假设我们有一个具有协变和逆变类型参数的类:
sealed trait Pipe[-I,+O,+R]
// case subclasses
我们为这个类的实例定义了单子操作:
object Pipe {
def flatMap[I,O,Ri,R](p: Pipe[I,O,Ri], f: Ri => Pipe[I,O,R]): Pipe[I,O,R] =
...
}
为了能够使用for
-comprehension,我们需要它flatMap
是 trait 本身的一个方法:
sealed trait Pipe[-I,+O,+R] {
def flatMap[I,O,Ri,R](f: Ri => Pipe[I,O,R]): Pipe[I,O,R] =
Pipe.flatMap(this, f);
}
但是,这不会编译,它失败了
逆变类型
I
出现在(R) => Pipe[I,O,R1]
value 类型的协变位置f
。
(协变类型参数也会出现类似的错误。)
我了解限制以及问题发生的原因。但是是否有一些解决方法,如何flatMap
使用Pipes.flatMap
与上述相同的语义来定义特征?也许使用一些隐式转换和/或中间构建器类?