同じ型パラメータでADTをenforeする方法:それがうまく働いた私はADT次いる
sealed trait Event
case class EventA(id: Int) extends Event
case class EventB(id: Int) extends Event
case object EventDontCare extends Event
object Event {
def test(ev: Event) = ev match {
case EventA(x) => x
case EventB(y) => y + 1
case EventDontCare => 0
}
}
val eva = EventA(10)
println(Event.test(eva))
が、今、私は2つの分割タイプ、上記のようにIDとして1を使用Int
、IDなどの他の使用String
を持っている必要があります。
sealed trait GEvent[ID]
case class GEventA[ID](id: ID) extends GEvent[ID]
case class GEventB[ID](id: ID) extends GEvent[ID]
object EventInt {
type Event = GEvent[Int]
type EventA = GEventA[Int]
type EventB = GEventB[Int]
case object EventDontCare extends GEvent[Int]
def test(ev: Event) = ev match {
case x: EventA => x.id
case y: EventB => y.id + 1
case EventDontCare => 0
}
}
object EventString {....}
val evi = new EventInt.EventA(10)
val evii = GEventA[Int](10)
val evd = EventInt.EventDontCare
println(EventInt.test(evd))
println(EventInt.test(evi))
println(EventInt.test(evii))
私がお願いしたいと思いますいくつかの質問があります:私はイベントの形質に型パラメータを追加しようとしました
- はANのすべてのメンバーに種類を注入するためのより良い方法はありますADT?私は上記のアプローチに満足していません。
test
メソッドのパターンマッチでは、case EventA(x) =>
またはイベントcase GEventA[Int](x) =>
を使用できないのはなぜですか? 同様に、new
キーワードで変数evi
を作成する必要がありますか?でも、私はすべての3ケースを紹介してきた、なぜコンパイラはまだ私に警告ん:
試合は網羅できない場合があります。それは、以下の入力に失敗します: EventDontCare
しかし、それはまだ正しく実行(DONTCAREケースのために10をプリントアウト)