¿Qué límites coloca la escala en la "complejidad aceptable" de los tipos inferidos?

120

De acuerdo con las especificaciones del lenguaje Scala :

... se permite la inferencia de tipo local para limitar la complejidad de los límites inferidos [de los parámetros de tipo]. La minimidad y la maximidad de los tipos deben entenderse en relación con el conjunto de tipos de complejidad aceptable.

En la práctica, ¿cuáles son los límites?

Además, ¿hay límites diferentes que se aplican a los tipos de expresión inferidos que a los límites de tipo de parámetro, y cuáles son esos límites?

Owen
fuente
2
este blog tiene una discusión interesante sobre este tema
Jamil
20
Sugeriría publicar en la lista de correo scala-language mencionada aquí: scala-lang.org/node/199
Dave L.
1
No estoy seguro, pero creo que significa que, por ejemplo, tenemos una lista de cadenas y le estamos agregando un int. La lista inmutable devuelta es en última instancia del tipo "Cualquiera". Así que la maximidad de los tipos
Jatin
8
Este es en realidad un objetivo móvil ya que las diferentes versiones del compilador Scala tienen límites diferentes. Esto ha cambiado y espero que continúe cambiando por lo menos en el futuro a corto plazo a medida que el lenguaje continúa desarrollándose. Voy a rechazar esta pregunta porque no se puede responder como se dice actualmente.
Kevin Sitze
1
@kevin True de hecho. Supongo que estoy más interesado en scala 2.9, ya que es reciente pero estable. Pero me pregunto cuánto cambiaría.
Owen

Respuestas:

10

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 e1es el LUB de los tipos de e1y 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.

retrónimo
fuente