Scalaのファミリー多型に現在推奨されているパターンは何ですか?Scalaのファミリー多型
モデリングゲームのやり方を試してますが、このソリューションは、最近登場:
trait Game[G <: Game[G]] {
type PLAYER <: Player[G]
type STATE <: State[G]
def players(): Set[G#PLAYER]
def startState(): G#STATE
}
trait Player[G <: Game[G]]
trait State[G <: Game[G]] {
def player(): G#PLAYER
}
特定のゲーム(この例ではポーカーは)それほどのようなものを形質の用語で表現することができる。
class Poker() extends Game[Poker] {
type PLAYER = PokerPlayer
type STATE = PokerState
val p1 = new PokerPlayer()
def players() = Set(p1)
def startState(): PokerState = ...
}
class PokerPlayer() extends Player[Poker]
class PokerState() extends State[Poker] {
def player(): PokerPlayer = ...
}
がどのようです:
私は、このセットアップに関するいくつかの質問を持っています0の0:と発音されますか?このような状況で
G
とGame
が果たしている役割の名前は何ですか? (この「再帰的な」関係に特に意味。)が、これは「家族の多型」の合理的な実装ですか?高いレベルでは、私の理解は、これはゲームとそのプレイヤーと状態が "家族"として変化しなければならないことを意味するということです。
Scalaの概要(2006)http://www.scala-lang.org/docu/files/ScalaOverview.pdf
マーティンKneisslのブログ(2009年:私は他の場所で、実質的に異なる、と私は別のトレードオフについて明確ではないよ見てきたことをScalaで家族の多型を取ります型クラス、マクロ、F-囲まれた多型、または何か他のものを含む家族の多型へのアプローチの)http://www.familie-kneissl.org/Members/martin/blog/family-polymorphism-in-scala
の議論は歓迎されています。
Suerethの "Scala in Depth"のリスト7.6では、同様の制約を持つ高級な「FileLike」特性が示されています。このリストは、Typeclassesがもっと良くできることの例として使用されています。 [Typeclassの代替案は、それが置き換えられるバージョンよりもはるかに直感的なので、私は何か基本的なものが欠けていると思います。] –