Scala协方差在进行模式匹配时

时间:2015-10-21 21:20:38

标签: scala pattern-matching covariance

我一直在写一个玩具符号代数系统。

  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编译器是否能够执行此操作(使用存在类型?)

0 个答案:

没有答案