Al inferir tipos, el compilador a menudo necesita calcular el Límite Superior Mínimo (LUB) de una lista de tipos. Por ejemplo, el tipo de if (cond) e1 else e1
es el LUB de los tipos de e1
y e1
.
Estos tipos pueden ser bastante grandes, por ejemplo, intente esto en un 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]...
Este compromiso introdujo algunas comprobaciones de cordura para limitar la profundidad de tales tipos inferidos.
Ha habido un trabajo reciente para completar el proceso de compilación para detectar tipos inferidos que tardan mucho en calcularse, y sugerir lugares donde una anotación explícita de tipo podría ser prudente.