我一直在写一个玩具符号代数系统。
trait Expr[A]
trait Func[A, B] extends Expr[A => B] with (Expr[A] => Expr[B])
case class Apply[A, B](f: Func[A, B], x: Expr[A]) extends Expr[B]
val fx: Expr[Int] = ???
fx match {
case Apply(f, x) =>
}
f
子句中case
的推断类型为Func[Any, Int]
,x
的类型为Any
。如果我将Func[A, B]
的签名更改为Func[-A, +B]
,则会将其推断为Func[Nothing, Int]
。在我看来,Scala编译器将一个不变类型参数视为协变参数。
这不是我想要的。我希望将其推断为∃T, f :: Func[T, B]
和x :: T
。
Scala编译器是否能够执行此操作(使用存在类型?)