14

私は次のことをしようとしています

trait Stateful {
  type State
}

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

つまり、の型はstate(の値) に依存しますsystem。ただし、これはサポートされていません。

不正な従属メソッド タイプ: パラメーターが、同じセクションまたは前のセクションの別のパラメーターのタイプに含まれています。

関数の引数を使用すると、引数を 2 つの引数リストに分割できますが、これはケース クラス コンストラクターでは不可能です。

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

私ができる最善のことは次のとおりです。

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

しかし、ドッティでは、型パラメーターが型メンバーに脱糖されていると思われるため、型パラメーターなしで可能であると考えていました。

私の質問は、これを型パラメーターなしで表現できるかということです。

より一般的なコンテキストでは、型パラメーターを型メンバーに置き換えることができる範囲と、そうするのが良いアイデアはいつなのかを探っています。

4

1 に答える 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)
于 2015-03-14T12:26:10.220 に答える