Case类构造函数参数类型,具体取决于前一个参数值

时间:2015-03-13 23:24:09

标签: scala case-class dependent-type dotty

我正在尝试执行以下操作

trait Stateful {
  type State
}

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

也就是说,state的类型取决于system的(值)。但是,这不受支持:

  

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

使用函数参数,我可以将参数拆分为两个参数列表,这对于案例类构造函数是不可能的:

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

我能做的最好的事情是:

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

但我认为没有类型参数应该是可能的,因为在dotty中,我认为类型参数是desugared到类型成员。

我的问题是,可以在没有类型参数的情况下表达吗?

在更一般的背景下,我正在探索类型成员可以用类型成员替换的程度,以及什么时候这样做是个好主意。

1 个答案:

答案 0 :(得分:8)

遗憾的是,依赖类型的多参数列表方法是not supported for constructors,所以不,你必须引入一个类型参数。

如果它变得烦恼,你可以隐藏这个事实,不过

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)