ユーザーが複数のプロセッサをチェーンできるシステムを作ろうとしています。私が抱えている問題は、各プロセッサが実際に気にかけている 2 ビットの情報を持っており、これらをタイプ セーフな方法で処理したいということです。私はそれをこの問題に煮詰めました:
与えられた:
//First family of stuff
trait A {
def doA {}
}
trait B {
def doB {}
}
//Second family of stuff
trait X {
def doX {}
}
trait Y {
def doY {}
}
2 つのファミリの要素を 4 つのフレーバーで組み合わせることができます。
var f = new A with X {}
f.doA
d.doX
var g = new A with Y {}
//...
偉大な。問題は、関数 (doA など) のそれぞれが 2 つの型の組み合わせを返して、ものを連鎖できるようにすることです。基本的に私がやりたいこと: trait A { def doThing = { new A with ThingThatImMixedInWithLikeXOrY {} } }
各プロセッサは、1) プロセッサに認識されている型、2) 混合された型で構成される匿名クラスを返す必要があります。
私の最初の刺し傷は、次のようなジェネリックを使用することでした:
trait A {
this : {def makeWithT[TOther]} =>
def doA = makeWithT[B]
}
trait B {
this : {def makeWithT[TOther]} =>
def doB = makeWithT[A]
}
trait X {
this : {def makeWithS[TOther]} =>
def doX = makeWithT[Y]
}
trait Y {
this : {def makeWithS[TOther]} =>
def doY = makeWithT[Y]
}
class Foo[T, S] extends S with T {
def makeWithT[OtherT] = new T with OtherT
def makeWithS[OtherT] = new S with OtherT
}
var f = new Foo[A, X]
f.doA.doB
f.doX.doA
f.doX.doY
...
明らかに、私は問題のカタログに遭遇しました:
型パラメーターから拡張されたジェネリック クラスを作成できません
ジェネリック パラメーターを使用して匿名クラスをインスタンス化できません
関数の戻り値の型をトレイトで定義することはできません。なぜなら、それが何かと混ざるまで型がわからないからです。
私は scala に関しては少し初心者であり、これについて完全に間違った方法で行っていると感じています。おそらく、暗黙と CanBuildFrom パターンを使用する必要があります。どんな助けでも大歓迎です。
乾杯