2

我正在尝试构造一个 type 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是 type A,我在这里错过了什么吗?我怀疑它与那些+和相关-,但我看不到问题......


更多细节:我怀疑问题隐藏在类型差异中的原因是因为如果 +A成为A-F成为Fin ,代码编译得很好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很多地方才能使它工作。

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

4

1 回答 1

0

不保证 Return 处的 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
  }
}
于 2014-01-16T12:34:38.557 回答