簡體   English   中英

模式匹配類型不匹配錯誤

[英]Pattern matching type mismatch error

我正在嘗試構造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
                     ^

我期望vA型,我在這里錯過了嗎? 我懷疑這與+- ,但我看不到問題...


更詳細:我懷疑問題隱藏在類型差異中是因為, 如果trait IO +A變為A-F變為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才能使其工作。

另外,我真的很想知道這個錯誤的原因~~

不能保證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
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM