Scala 意外类型推理故障排除



我长期以来一直在为O输出类型的错误类型推断而苦苦挣扎。为什么 scalac 看到的是Int而不是(Int,String)?:

trait Request[I,+O,C[_]]
case class Get[I, O, C[_]](storeName: String, arg: C[I]) extends Request[I,(I,O),C]
object Question {
  val get: Request[Int,(Int,String), List] = Get("play", List(1))
}
[error]  found   : com.viagraphs.idb.Get[Int,Int,List]
[error]  required: com.viagraphs.idb.Request[Int,(Int, String),List]
[error]       val get: Request[Int,(Int,String), List] = Get("play", List(1))

请忽略W,R,ValidKey类型类,我想它们在这里无关紧要。

完全相同的情况是这样发生的:

case class Append[I : W, O : R : ValidKey](storeName: String, arg: List[I]) extends Request[I,(O,I),List]
object Question {
  val get: Request[Int,(Int,String), List] = Get("play", List(1))
}
val append: Request[String,(Int,String), List] = Append("play", List("foo"))
[error]  found   : com.viagraphs.idb.Append[String,String]
[error]  required: com.viagraphs.idb.Request[String,(Int, String),List]
[error]       val append: Request[String,(Int,String), List] = Append("play", List("foo"))

我试图用-Ytyper-debug来处理这个问题,但它真的是硬核的东西,我不明白它的机制。

更新:我使用排序类型类重现了它,知道不满足什么隐式解析规则吗?

  trait Req[I,O]
  case class Insert[I : Ordering, O : Ordering](arg: I) extends Req[I,O]
  def execute[I,O](req: Req[I,O]): O = null.asInstanceOf[O]
  def main() = {
    val result: Int = execute(Insert("test"))  
  }
error: type mismatch;
 found   : String
 required: Int
    val result: Int = execute(Insert("test"))  

好的,我尝试将一个简单的示例放在一起,它在我的机器上编译得很好,在 scala 2.11.4 上使用 sbt 0.13.7

package example
object Main extends App {
  trait Request[I,+O,C[_]]
  trait W[A]
  trait R[A]
  trait ValidKey[A]
  implicit val wString = new W[String]{}
  implicit val rInt = new R[Int]{}
  implicit val validKeyInt = new ValidKey[Int]{}
  case class Append[I: W, O: R : ValidKey](storeName: String, arg: List[I]) extends Request[I,(O,I),List]
  val append: Request[String,(Int,String), List] = Append("play", List("foo"))
}

我错过了什么吗?

尝试将其更改为:

Get[Int, String, List]("play", List(1))

我能够在 Intellij 中重现您的问题,尽管它有一个不同类型的推理问题,但这似乎使错误消失了。

相关内容

  • 没有找到相关文章

最新更新