【发布时间】:2014-12-11 23:23:38
【问题描述】:
我一直在为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 来处理这个问题,但它确实是硬核的东西,我不了解它的机制。
更新:我使用 Ordering 类型类复制了它,知道不满足什么隐式解析规则吗?
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"))
【问题讨论】:
-
第一个例子编译
-
这可能是一个错误,它使用与我在 SBT 项目中使用的相同 scala 版本在 REPL 中编译,但它无法编译..
标签: scala type-inference scalac