Lors de l'inférence de types, le compilateur a souvent besoin de calculer la moindre limite Supérieure (LUB) d'une liste de types. Par exemple, le type d' if (cond) e1 else e1
est le LUB des types d' e1
et e1
.
Ces types de peut devenir très grand, pour exemple, essayez ceci dans 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]...
Cette commettre introduit quelques vérifications afin de limiter la profondeur de ces types déduits.
Il y a eu certains travaux récents de plugin pour le processus de compilation pour détecter déduit types qui prennent beaucoup de temps à calculer, et de suggérer des endroits où une annotation de type explicite pourrait être prudente.