Scala で f-bounded ポリモーフィズムを実現するには、抽象型を使用する必要があると述べている記事をいくつか読みました。これは主に、型推論の問題を軽減するためですが、再帰型を定義するときに型パラメーターが導入するように見える二次成長を取り除くためでもあります。
これらは次のように定義されています。
trait EventSourced[E] {
self =>
type FBound <: EventSourced[E] { type FBound <: self.FBound }
def apply(event: E): FBound
}
ただし、これにより次の 2 つの問題が発生するようです。
1) ユーザーがこの型のオブジェクトを参照するたびに、FBound
型パラメーターも参照する必要があります。これはコードの匂いのように感じます:
def mapToSomething[ES <: EventSourced[E], E](eventSourced: ES#FBound): Something[ES, E] = ...
2) コンパイラは、上記のようなメソッドの型パラメータを推測できなくなり、次のメッセージで失敗します。
Type mismatch, expected: NotInferredES#FBound, actual: MyImpl#FBound
f-bounded polymorphism の実装に成功し、コンパイラが型を推測できるようになった人はいますか?