共変と反変の型パラメーターを持つクラスがあるとします。
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
は、それがトレイト自体のメソッドである必要があります。
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]
f
(共変型パラメータでも同様のエラーが発生します。)
制限と問題が発生する理由を理解しています。しかし、上記と同じセマンティクスflatMap
を使用して特性を定義する方法はありますか? Pipes.flatMap
おそらく、いくつかの暗黙的な変換や中間ビルダー クラスを使用していますか?