scala type-inference

scala annotations



¿Qué límites coloca Scala en la "complejidad aceptable" de los tipos inferidos? (1)

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 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 algunos controles de cordura para limitar la profundidad de dichos tipos inferidos.

Recientemente se ha llevado a cabo un trabajo de complemento en el proceso de compilación para detectar los tipos inferidos que tardan mucho tiempo en calcularse, y sugerir lugares donde una anotación de tipo explícita podría ser prudente.

De acuerdo con la especificación de idioma de Scala :

... se permite la inferencia de tipo local para limitar la complejidad de los límites inferidos [de los parámetros de tipo]. La minimización y la maximalidad 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 diferentes límites que se aplican a los tipos de expresiones inferidas que a los límites de tipo de parámetro, y cuáles son esos límites?