121 votes

Quelles sont les limites de la scala place sur le "acceptable complexité" de types déduits?

Selon la Scala de Langue Spec:

... locale de l'inférence de type est autorisé à limiter la complexité de déduire les limites [de paramètres de type]. Minimality et maximality de types doivent être compris par rapport à l'ensemble des types de complexité acceptable.

Dans la pratique, quelles sont les limites?

Aussi, sont-ils différents des limites qui s'appliquent à déduire l'expression de types que le paramètre type de limites, et quelles sont ces limites?

10voto

retronym Points 35066

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X