なぜeffects
はEffect[A]
ですか?タイプはfoo
になります。パターンマッチングはタイプ境界を失うか?
/***
scalaVersion := "2.11.8"
*/
trait Effect[A]
sealed trait ActionResult[+M, +A] {
}
sealed trait ModelUpdated[+M] extends ActionResult[M, Nothing] {
}
sealed trait HasEffect[+M, +A] extends ActionResult[M, A] {
}
sealed trait UpdateSilent
object ActionResult {
case object NoChange extends ActionResult[Nothing, Nothing]
final case class ModelUpdate[M](newModel: M) extends ModelUpdated[M]
final case class ModelUpdateSilent[M](newModel: M) extends ModelUpdated[M] with UpdateSilent
final case class EffectOnly[A](effect: Effect[A]) extends ActionResult[Nothing, A] with HasEffect[Nothing, A]
final case class ModelUpdateEffect[M, A](newModel: M, effect: Effect[A]) extends ModelUpdated[M] with HasEffect[M, A]
final case class ModelUpdateSilentEffect[M, A](newModel: M, effect: Effect[A])
extends ModelUpdated[M] with HasEffect[M, A] with UpdateSilent
def apply[M, A](model: Option[M], effect: Option[Effect[A]]): ActionResult[M, A] = (model, effect) match {
case (Some(m), Some(e)) => ModelUpdateEffect(m, e)
case (Some(m), None) => ModelUpdate(m)
case (None, Some(e)) => EffectOnly(e)
case _ => NoChange
}
}
object Main {
def foo[A, B]: ActionResult[A, B] = ???
def dispatch[A, B] = {
foo[A, B] match {
case ActionResult.NoChange =>
false
case ActionResult.ModelUpdate(newModel) =>
false
case ActionResult.ModelUpdateSilent(newModel) =>
true
case ActionResult.EffectOnly(effects) =>
true
case ActionResult.ModelUpdateEffect(newModel, effects) =>
val e: Effect[A] = effects
false
case ActionResult.ModelUpdateSilentEffect(newModel, effects: Effect[A]) =>
true
}
}
}
あなたは 'val e:Effect [B] = effects'を意味しませんか? –