출력 유형이 O
인 잘못된 유형 추론으로 오랜 시간 애써 왔습니다. 왜 scalac은 (Int,String)
대신 Int
을 볼 수 있습니까? :예기치 않은 유형 추론 문제 해결
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
을 사용하여 처리하려하지만 나는 그것의 역학을 이해하지 못했지만, 정말 하드 코어 물건입니다.
업데이트 : 주문 유형 클래스를 사용하여 복제했는데 암시 적 해결 규칙이 충족되지 않았다는 아이디어가 있습니까?
Get[Int, String, List]("play", List(1))
내가 그것을 다른 타입 추론 문제를 가지고 있지만, 인 IntelliJ에서 문제를 재현 할 수 있었다, 그러나 이것은 오류가 멀리 갈 수 있도록 보인다
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 프로젝트에서 사용하는 것과 동일한 스칼라 버전을 사용하여 REPL로 컴파일됩니다. – lisak