2013-01-03 6 views
9

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 = ... 
} 

  1. がどのようです:

    私は、このセットアップに関するいくつかの質問を持っています0の0:と発音されますか?このような状況でGGameが果たしている役割の名前は何ですか? (この「再帰的な」関係に特に意味。)

  2. が、これは「家族の多型」の合理的な実装ですか?高いレベルでは、私の理解は、これはゲームとそのプレイヤーと状態が "家族"として変化しなければならないことを意味するということです。

  3. の議論は歓迎されています。

+0

Suerethの "Scala in Depth"のリスト7.6では、同様の制約を持つ高級な「FileLike」特性が示されています。このリストは、Typeclassesがもっと良くできることの例として使用されています。 [Typeclassの代替案は、それが置き換えられるバージョンよりもはるかに直感的なので、私は何か基本的なものが欠けていると思います。] –

答えて

2

私は、形質の「外側」のクラスを定義する必要性について全く疑問を持っています。タイプPlayerStateはすでにゲームに依存しているため、さらに制限する必要はありません。

trait Game { 
    type Player 
    type State <: StateLike 

    trait StateLike { 
    def player: Player 
    } 

    def startState: State 
} 

class Poker extends Game { 
    class Player 
    class State extends StateLike { ... } 
    val startState = new State 
} 

必要に応じてケーキパターンを使用して、異なる部分を異なる特性/ファイルに分けることができます。

trait PokerPlayer extends Game { 
    class Player 
} 
trait PokerState extends Game with PokerPlayer { 
    class State extends StateLike { ... } 
} 
class Poker extends Game with PokerPlayer with PokerState { 
    val startState = ... 
} 
+0

ありがとう!はい、これははるかに慣れているようです。私は疑問を提起してからしばらくしていたので、すぐにコードとあなたのソリューションを再確認します。 –