案例类构造函数参数类型取决于先前参数的值

14

我想要做以下事情

trait Stateful {
  type State
}

case class SystemState(system: Stateful, state: system.State) // does not compile

换言之,state的类型取决于(system的值)。然而,这是不被支持的:

非法的依赖方法类型:参数在同一部分或更早的部分中出现在另一个参数的类型中

使用函数参数,我可以将参数拆分成两个参数列表,但在 case class 构造函数中无法实现:

def f(system: Stateful)(state: system.State): Unit = {} // compiles

我能做到的最好就是:

case class SystemState[S](system: Stateful { type State = S }, state: S) // compiles

但我认为应该可以不使用类型参数,因为在Dotty中,类型参数可以被转换为类型成员。

那么我的问题是,是否可以在不使用类型参数的情况下表达它?

在更一般的背景下,我正在探索在多大程度上可以用类型成员代替类型参数,以及何时这样做是一个好主意。

1个回答

9

多参数列表方法对于依赖类型来说不幸的是不支持构造函数,因此你必须引入一个类型参数。

如果这个问题变得很烦人,你可以隐藏这个事实。

trait Stateful {
  type State
}

object SystemState {
  def apply(system: Stateful)(state: system.State): SystemState = 
    new Impl[system.State](system, state)

  private case class Impl[S](val system: Stateful { type State = S }, 
                             val state: S)
    extends SystemState {
    override def productPrefix = "SystemState"
  }
}
trait SystemState {
  val system: Stateful
  val state: system.State
}

case object Test extends Stateful { type State = Int }
val x = SystemState(Test)(1234)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接