2012-07-11 8 views
122

De acuerdo con la Scala Language Spec:¿Qué límites tiene Scala en la "complejidad aceptable" de los tipos inferidos?

... inferencia de tipos locales se permite limitar la complejidad de inferidos límites [de los parámetros de tipo]. Se debe entender la minimización y la maximalidad de los tipos 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?

+2

[este blog] (http://pchiusano.blogspot.com/2011/05/making-most-of-scalas-extremely-limited.html) tiene alguna discusión interesante sobre este tema – Jamil

+0

Sí, menciona un tipo del tipo que scala rechazará inferir: un constructor de tipo aplicado parcialmente. Me pregunto si hay otros. – Owen

+20

Sugiero publicar en la lista de correo en scala que se menciona aquí: http://www.scala-lang.org/node/199 – david

Respuesta

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 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.

Cuestiones relacionadas