我正在尝试构造一个类型IO
,IO[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
使其有效。
另外,我真的很想知道这个错误背后的原因~~
答案 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
}
}