Tom*_*ula 14 scala case-class dotty dependent-type
我正在尝试执行以下操作
trait Stateful {
type State
}
case class SystemState(system: Stateful, state: system.State) // does not compile
Run Code Online (Sandbox Code Playgroud)
也就是说,类型state取决于(的值)system.但是,不支持:
非法依赖方法类型:参数出现在同一节中的另一个参数的类型或更早的参数中
使用函数参数,我可以将参数拆分为两个参数列表,这对于案例类构造函数是不可能的:
def f(system: Stateful)(state: system.State): Unit = {} // compiles
Run Code Online (Sandbox Code Playgroud)
我能做的最好的事情是:
case class SystemState[S](system: Stateful { type State = S }, state: S) // compiles
Run Code Online (Sandbox Code Playgroud)
但我认为没有类型参数应该是可能的,因为在dotty中,我认为类型参数是desugared类型成员.
那么我的问题是,这可以在没有类型参数的情况下表达吗?
在更一般的上下文中,我正在探索类型成员可以用类型成员替换类型参数的程度,何时这样做是个好主意.
遗憾的是,构造函数不支持依赖类型的多参数列表方法,因此不需要引入类型参数.
不过,如果它变得烦人,你可以隐藏这个事实
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)
Run Code Online (Sandbox Code Playgroud)