链接路径相关类型并在Scala中具有不同参数列表时实例化它们

链接路径相关类型并在Scala中具有不同参数列表时实例化它们,scala,shapeless,dependent-type,path-dependent-type,Scala,Shapeless,Dependent Type,Path Dependent Type,我正在尝试通过实现一个简单的纸牌游戏来编写更静态的类型安全代码。在这个游戏中,有几张独特的牌,每张牌都有一个特定于牌的效果,这可能需要额外的参数(例如,效果的目标)。一名玩家持有两张牌,轮到他时选择其中一张,使该牌产生效果 注意:本文中的大部分细节都是在REPL中试用的。我编写了一个不太静态的类型安全实现,但我想在完全投入之前确保我想要的是可行的 以下是一些相关的定义: trait cardEffects参数 案例类OneTarget(玩家:玩家)扩展CardEffectParams 案例类Tw

我正在尝试通过实现一个简单的纸牌游戏来编写更静态的类型安全代码。在这个游戏中,有几张独特的牌,每张牌都有一个特定于牌的效果,这可能需要额外的参数(例如,效果的目标)。一名玩家持有两张牌,轮到他时选择其中一张,使该牌产生效果

注意:本文中的大部分细节都是在REPL中试用的。我编写了一个不太静态的类型安全实现,但我想在完全投入之前确保我想要的是可行的

以下是一些相关的定义:

trait cardEffects参数
案例类OneTarget(玩家:玩家)扩展CardEffectParams
案例类TwoTargets(player1:Player,player2:Player)扩展了CardEffectParams
// ...
特征卡{
//要使用的参数特定于卡

键入Params对于第一个问题,我将用表示关系的类型替换元组

trait CardAndParams {
    type C <: Card
    val card: C
    val params: C#Params
}

def choose[R <: CardAndParams](hand: Hand, gameState: GameState)(
    implicit helper: Helper {type Out = R}): R
但是我想你需要一种从随机生成的卡片移动到强类型卡片的方法,对于这种情况,模式匹配似乎是合适的,因为在类型级别表示随机卡片是困难的


一般来说,这种类型级别的编程是可能的,但在Scala中很难实现-这种语言并不是专门为它设计的。如果你想把它发展到极致,最好使用像Idris这样的工具。

简短回答:这可能是可能的,但很痛苦。我正在研究如何让它工作。希望它很难看。
sealed trait RandomStrategyHelper[C <: Card] {
    def params(): C#Params
}
object RandomStrategyHelper {
    implicit def forCardA = new RandomStrategyHelper[CardA] {
        def params() = 1 :: HNil
    }
    implicit def forCardB = new RandomStrategyHelper[CardB] {
        def params() = 1 :: 2 :: HNil
    }
}

def randomParams[C <: Card](card: C)(implicit rsh: RandomStrategyHelper[C]) =
    rsh.params()