Scala中的家族多态性

时间:2013-01-03 05:53:56

标签: scala polymorphism

目前推荐的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. Game[G <: Game[G]]如何用英语发音 GGame在这种情况下扮演的角色有哪些名称? (具体在这个“递归”关系中有意义。)

  2. 这是“家庭多态性”的合理实施吗?在高层次上,我的理解是,这意味着游戏及其玩家和国家必须作为“家庭”而变化。我在其他地方看到的Scala中的家族多态性差异很大,我不清楚这些不同的权衡:

  3. 欢迎讨论涉及类型类,宏,f-有界多态或家庭多态性的方法。

1 个答案:

答案 0 :(得分:2)

我会质疑是否需要定义类&#34;外部&#34;这个特质。 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 = ...
}