模式匹配类型不匹配错误

时间:2014-01-16 12:07:20

标签: scala pattern-matching covariance type-inference higher-kinded-types

我正在尝试构造一个类型IOIO[File, String]将表示类似于File操作,它将返回String作为结果。 我有以下问题:

object testcase1 {
  import scala.language.higherKinds

  trait IO[-F[+_], +A]
  case class Return[-F[+_], +A](value: A) extends IO[F, A]

  def fn[F[+_], A](op: IO[F, A]): A = op match {
    case Return(v) => v    // <---- type mismatch error
  }
}

type mismatch
found   : v.type (with underlying type Any)
required: A
   case Return(v) => v
                     ^

我希望v属于A类型,我在这里错过了什么吗? 我怀疑它与那些+-有关,但我看不出问题......


更多细节: 我怀疑问题隐藏在类型差异中的原因是因为如果 +A成为A-F成为F,则代码编译正常 trait IO,如:

object testcase1 {
  import scala.language.higherKinds

  trait IO[F[+_], +A]    // note the missing "-" in front of F
  case class Return[F[+_], +A](value: A) extends IO[F, A]

  def fn[F[+_], A](op: IO[F, A]): A = op match {
    case Return(v) => v    // <---- compiles FINE!!
  }
}

正如@igx建议的那样,使用v.asInstanceOf[A]可以强制它进行编译,但由于我只是在这里提出了一个非常小的问题,我将不得不在很多地方添加asInstanceOf使其有效。

另外,我真的很想知道这个错误背后的原因~~

1 个答案:

答案 0 :(得分:0)

他在返回时输入A不能保证与fn中的A相同。如果你确定你可以强制它(但我不确定你想做什么):

object testcase1 {
  import scala.language.higherKinds

  trait IO[-F[+_], +A]
  case class Return[-F[+_], +A](value: A) extends IO[F, A]

  def fn[F[+_], A](op: IO[F, A]): A = op match {
    case Return(v) => v.asInstanceOf[A]    // <---- OK
  }
}