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 llegar a ser muy grande, por ejemplo intentar 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 commit introdujo algo de cordura comprueba para limitar la profundidad de tales tipos inferidos.
Ha habido algunos trabajos recientes para agregar al proceso de compilación para detectar tipos inferidos que tardan mucho en calcularse, y sugerir lugares donde una anotación de tipo explícita podría ser prudente.
[este blog] (http://pchiusano.blogspot.com/2011/05/making-most-of-scalas-extremely-limited.html) tiene alguna discusión interesante sobre este tema – Jamil
Sí, menciona un tipo del tipo que scala rechazará inferir: un constructor de tipo aplicado parcialmente. Me pregunto si hay otros. – Owen
Sugiero publicar en la lista de correo en scala que se menciona aquí: http://www.scala-lang.org/node/199 – david