3

ユーザーが複数のプロセッサをチェーンできるシステムを作ろうとしています。私が抱えている問題は、各プロセッサが実際に気にかけている 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
...

明らかに、私は問題のカタログに遭遇しました:

  1. 型パラメーターから拡張されたジェネリック クラスを作成できません

  2. ジェネリック パラメーターを使用して匿名クラスをインスタンス化できません

  3. 関数の戻り値の型をトレイトで定義することはできません。なぜなら、それが何かと混ざるまで型がわからないからです。

私は scala に関しては少し初心者であり、これについて完全に間違った方法で行っていると感じています。おそらく、暗黙と CanBuildFrom パターンを使用する必要があります。どんな助けでも大歓迎です。

乾杯

4

1 に答える 1

1

スタッカブル プロセッサの最もよく知られているソリューションは、スタッカブル トレイトです。

http://www.artima.com/scalazine/articles/stackable_trait_pattern.html

trait StackableRoot {
  def StackablePass (x:Int) : x
}
trait StackableDouble extends StackableRoot {
  def internalPass (x:Int) = 2*x
  abstract override def StackablePass(x:Int) = super.StackablePass(internalPass(x))
}
trait StackableIncrement extends StackableRoot {
  def internalPass (x:Int) = x+1
  abstract override def StackablePass(x:Int) = super.StackablePass(internalPass(x))
}

いくつかのボイラープレートがあります

  abstract override def StackablePass(x:Int) = super.StackablePass(internalPass(x))

有名な型消去によって禁止されている異なるパラメーターを持ついくつかの特性を複数回継承するためにscalaが必要になるため、パラメーター化された特性にパックすることによって回避することはできません

于 2012-06-01T17:43:11.983 に答える