Это не тип:Тип вывода и модель Maching в Scala
sealed trait BinOp[-InA, -InB, +Out]
case object Add extends BinOp[Int, Int, Int]
sealed trait Expression[+A]
final case class IntegerAtom(value: Int) extends Expression[Int]
final case class BinaryExp[-A, -B, +C](op: BinOp[A, B, C], lhs: Expression[A], rhs: Expression[B]) extends Expression[C]
def optimizeStep[A](x: Expression[A]): Expression[A] = x match {
case BinaryExp(Add, IntegerAtom(a), IntegerAtom(b)) => IntegerAtom(a + b)
}
Самое непосредственное, что является использование в случае объекта в шаблоне сопоставляются:
[error] (...) pattern type is incompatible with expected type;
[error] found : minimumexample.Add.type
[error] required: minimumexample.BinOp[Any,Any,A]
кажется, что это может быть решена путем введения глазной кровотечение:
val AddOp = Add
И потом:
case BinaryExp(AddOp, IntegerAtom(a), IntegerAtom(b)) => IntegerAtom(a + b)
Но тогда:
[error] (...) type mismatch;
[error] found : minimumexample.IntegerAtom
[error] required: minimumexample.Expression[A]
[error] case BinaryExp(AddOp, IntegerAtom(a), IntegerAtom(b)) => IntegerAtom(a + b)
[error] ^
Я хочу, чтобы решить эту проблему, как типа безопасно, насколько это возможно, не прибегая к .asInstanceOf[]
. Мысли?
Это минимальный (не) рабочий пример. Компилятор не понимает, что 'A' становится' Int' после соответствия шаблону. –
Что я говорю, ошибки, которые я получаю при вставке этого кода в REPL, сильно отличаются от ошибок, которые вы получаете. Ошибки дисперсии вызывают последующие ошибки, о которых вы спрашиваете. –