模式匹配类型不匹配错误



我正在尝试构造一个类型IOIO[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
                     ^

我以为vA型,我在这里错过了什么吗?我怀疑这与那些+-有关,但我看不到问题......


更多详情:我怀疑问题隐藏在类型差异中的原因是,如果+A变得A-Ftrait IO中变得F,代码可以很好地编译,例如:

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才能使其工作。

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

他 返回

时键入 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
  }
}

相关内容

  • 没有找到相关文章

最新更新