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


120

Scala 언어 사양 에 따르면 :

... 로컬 유형 추론은 [유형 매개 변수의] 추론 된 경계의 복잡성을 제한하도록 허용됩니다. 유형의 최소 성과 최대성은 수용 가능한 복잡성 유형의 집합과 관련하여 이해되어야합니다.

실제로 한계는 무엇입니까?

또한 추론 된 표현식 유형에 적용되는 매개 변수 유형 경계와 다른 제한이 있으며 이러한 제한은 무엇입니까?


2
이 블로그는 이 주제에 대한 몇 가지 흥미로운 토론이
자밀

20
여기에 언급 된 스칼라 언어 메일 링리스트에 게시하는 것이 좋습니다. scala-lang.org/node/199
Dave L.

1
확실하지는 않지만 예를 들어 문자열 목록이 있고 여기에 int를 추가한다는 의미라고 생각합니다. 반환 된 불변 목록은 궁극적으로 "Any"유형입니다. 유형의 maximality 그래서
Jatin

8
Scala 컴파일러의 버전에 따라 한계가 다르기 때문에 이것은 실제로 움직이는 타겟입니다. 이것은 변경되었으며 언어가 계속 발전함에 따라 적어도 가까운 장래에 계속 변경 될 것으로 기대합니다. 현재 명시된대로 답변 할 수 없기 때문에이 질문에 투표합니다.
Kevin Sitze

1
@kevin True 참. 나는 scala 2.9가 최근이지만 안정적이기 때문에 가장 관심이 있다고 생각합니다. 하지만 얼마나 변할지 궁금합니다.
Owen

답변:


10

유형을 추론 할 때 컴파일러는 유형 목록의 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]...

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.