2014-12-11 11 views
1

출력 유형이 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")) 
+0

첫 번째 예가 –

+0

으로 컴파일됩니다. 버그 일 가능성이 높습니다. SBT 프로젝트에서 사용하는 것과 동일한 스칼라 버전을 사용하여 REPL로 컴파일됩니다. – lisak

답변

1

좋아, 내가 함께 간단한 예제를 넣어 시도하고 난 아무것도 실종

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")) 

} 

스칼라 2.11.4에 SBT 0.13.7를 사용하여 내 컴퓨터에서 잘 컴파일?

+0

와우, 그렇다면이 클래스를 컴파일해야하기 때문에 이러한 클래스가 발생해야합니다. 그 유형이 추론 될 때 TC의 내재 된 증거 ​​해결의 문제라고 생각합니다. 대부분 uPickle Reader/Writer 유형 클래스가 원인 일 가능성이 높습니다. -/ – lisak

+0

https://github.com/lihaoyi/upickle/issues/51#issuecomment-66716507 – lisak

+0

실제로 원래 원인은 https : // github입니다. .com/lihaoyi/upickle/issues/52 – lisak

0

봅니다이로 변경합니다.

+0

글쎄, 이것은 타입 유추가 아닙니다. 고전적인 타입 선언 ... 나는 타입을 추론 할 수 있도록 사용자/호출자가 그것을 사용할 수 있기를 원하지만 분명히 작동하지 않는다. result.flatMap {value : Infered [Types] => – lisak