Scalaでf束縛多型を達成するために抽象型を使用するべきであることを表現する記事をいくつか読んだ。これは、主に型推論の問題を緩和するだけでなく、再帰型を定義するときに型パラメータが導入すると思われる二次的な増加を取り除くことです。 Scalaで抽象型を持つF束縛多型
これら
はそうのように定義されています1)ユーザーは、このタイプのオブジェクトを参照しようとするたびに、彼らはまた、参照する必要があります。
trait EventSourced[E] {
self =>
type FBound <: EventSourced[E] { type FBound <: self.FBound }
def apply(event: E): FBound
}
しかし、これには二つの問題を導入するように見えますFBound
タイプのパラメータ。
def mapToSomething[ES <: EventSourced[E], E](eventSourced: ES#FBound): Something[ES, E] = ...
2)コンパイラはメッセージで失敗し、上記のような方法のための型パラメータを推測することになりましたができません:
Type mismatch, expected: NotInferredES#FBound, actual: MyImpl#FBound
はそこに誰も使用しているこれは、コードのにおいのように感じていますコンパイラが型を推論することができるように、その解決法でfの束縛された多型の実装を成功させましたか?
Scalaのコレクションライブラリは問題なく成功したF-囲まれた多型を使用しています。型メンバーではなく型パラメーターを使用します。それに基づいて解決策を試すことができます。 – wingedsubmariner
あなたは私に見せてくれる例、つまり図書館のどの部分でこれをしていますか? –
標準ライブラリの[List](http://www.scala-lang.org/api/current/index.html#scala.collection.immutable.List)を参照してください。 GenericTraversableTemplateとLinearSeqOptimizedの継承に使用されているFバウンドの多型に注目してください。 – wingedsubmariner