gpt4 book ai didi

scala - Scala中的家庭多态性

转载 作者:行者123 更新时间:2023-12-04 04:35:25 30 4
gpt4 key购买 nike

目前推荐的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 = ...
}

我对此设置有几个疑问:
  • 用英语发音“Game[G <: Game[G]]”吗?在这种情况下GGame扮演的角色的名称是什么? (特别是在这种“递归”关系中。)
  • 这是“家庭多态性”的合理实现吗?从高层次来看,我的理解是,这意味着游戏及其玩家和国家必须作为一个“家庭”而变化。我在其他地方看到过的Scala家庭多态性的看法有很大不同,并且我不清楚在不同的权衡下:
  • Scala概述(2006)http://www.scala-lang.org/docu/files/ScalaOverview.pdf
  • Martin Kneissl博客(2009)http://www.familie-kneissl.org/Members/martin/blog/family-polymorphism-in-scala
  • 欢迎讨论涉及类型类,宏,f界多态性或其他任何事物的家庭多态性方法。
  • 最佳答案

    我会质疑是否有必要在特征的“外部”定义所有类。 PlayerState类型已经依赖于Game,因此您无需尝试进一步限制它。

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

    关于scala - Scala中的家庭多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14133748/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com