При выводе типов компилятору часто требуется вычислить наименьшую верхнюю границу (LUB) списка типов. Например, тип if (cond) e1 else e1
- это LUB из типов e1
и 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]...
Этот коммит ввел некоторые проверки работоспособности, чтобы ограничить глубину таких предполагаемых типов.
Недавно была проделана некоторая работа по надстройке над процессом компиляции для обнаружения предполагаемых типов, вычисление которых занимает много времени, и предложения мест, где явная аннотация типа может быть целесообразной.