Scala 언어 사양 에 따르면 :
… 로컬 유형 추론은 [유형 매개 변수의] 추론 된 경계의 복잡성을 제한하도록 허용됩니다. 유형의 최소 성과 최대성은 수용 가능한 복잡성 유형의 집합과 관련하여 이해되어야합니다.
실제로 한계는 무엇입니까?
또한 추론 된 표현식 유형에 적용되는 매개 변수 유형 경계와 다른 제한이 있으며 이러한 제한은 무엇입니까?
답변
유형을 추론 할 때 컴파일러는 유형 목록의 LUB (Least Upper Bound)를 계산해야하는 경우가 많습니다. 예를 들어, if (cond) e1 else e1
유형은 e1
및 유형의 LUB입니다.e1
.
이러한 유형은 상당히 커질 수 있습니다. 예를 들어 REPL에서 시도해보세요.
:type Map(1 -> (1 to 10), 2 -> (1 to 10).toList)
scala.collection.immutable.Map[Int,scala.collection.immutable.Seq[Int] with scala.collection.AbstractSeq[Int] with Serializable{def reverse: scala.collection.immutable.Seq[Int] with scala.collection.AbstractSeq[Int]{def reverse: scala.collection.immutable.Seq[Int] with scala.collection.AbstractSeq[Int]; def dropRight(n: Int): scala.collection.immutable.Seq[Int] with scala.collection.AbstractSeq[Int]; def takeRight(n: Int): scala.collection.immutable.Seq[Int] with scala.collection.AbstractSeq[Int]; def drop(n: Int): scala.collection.immutable.Seq[Int] with scala.collection.AbstractSeq[Int]; def take(n: Int): scala.collection.immutable.Seq[Int] with scala.collection.AbstractSeq[Int]}; def dropRight(n: Int): scala.collection.immutable.Seq[Int] with scala.collection.AbstractSeq[Int]{def reverse: scala.collection.immutable.Seq[Int] with scala.collection.AbstractSeq[Int]; def dropRight(n: Int): scala.collection.immutable.Seq[Int]...
이 커밋 은 그러한 추론 된 유형의 깊이를 제한하기 위해 몇 가지 온 전성 검사를 도입했습니다.
계산하는 데 오랜 시간이 걸리는 추론 된 유형을 감지하고 명시 적 유형 주석이 신중할 수있는 위치를 제안하기 위해 컴파일 프로세스에 플러그인하는 최근 작업이 있습니다.