[scala] 스칼라는 추론 된 유형의 “허용 가능한 복잡성”에 어떤 제한을 두나요?

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]...

커밋 은 그러한 추론 된 유형의 깊이를 제한하기 위해 몇 가지 온 전성 검사를 도입했습니다.

계산하는 데 오랜 시간이 걸리는 추론 된 유형을 감지하고 명시 적 유형 주석이 신중할 수있는 위치를 제안하기 위해 컴파일 프로세스에 플러그인하는 최근 작업이 있습니다.


답변