Quali limiti pone scala alla “complessità accettabile” dei tipi dedotti?


120

Secondo la Scala Language Spec :

... l'inferenza di tipo locale è consentita per limitare la complessità dei limiti dedotti [dei parametri di tipo]. La minimalità e la massimalità dei tipi devono essere comprese rispetto all'insieme dei tipi di complessità accettabile.

In pratica quali sono i limiti?

Inoltre, esistono limiti diversi che si applicano ai tipi di espressione dedotti rispetto ai limiti del tipo di parametro e quali sono questi limiti?


2
questo blog ha alcune discussioni interessanti su questo argomento
Jamil

20
Suggerirei di inviare un messaggio alla mailing list in lingua scala menzionata qui: scala-lang.org/node/199
Dave L.

1
Non ne sono sicuro, ma penso che ad esempio significhi che abbiamo un elenco di stringhe a cui stiamo aggiungendo un int. L'elenco immutabile restituito è in definitiva di tipo "Any". Quindi massimalità dei tipi
Jatin

8
Questo è in realtà un target mobile poiché diverse versioni del compilatore Scala hanno limiti diversi. Questo è cambiato e mi aspetto che continuerà a cambiare almeno per il futuro a breve termine mentre il linguaggio continua a svilupparsi. Voterò a favore di questa domanda perché non è possibile rispondere come è attualmente affermato.
Kevin Sitze

1
@kevin True in effetti. Suppongo di essere più interessato alla scala 2.9, poiché è recente ma stabile. Ma mi chiedo quanto cambierebbe.
Owen,

Risposte:


10

Quando si inferiscono i tipi, il compilatore spesso deve calcolare il limite minimo superiore (LUB) di un elenco di tipi. Ad esempio, il tipo di if (cond) e1 else e1è il LUB dei tipi di e1ee1 .

Questi tipi possono diventare piuttosto grandi, ad esempio provalo in 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]...

Questo commit ha introdotto alcuni controlli di integrità per limitare la profondità di tali tipi dedotti.

C'è stato un lavoro recente per collegare il processo di compilazione per rilevare i tipi dedotti che richiedono molto tempo per il calcolo e suggerire luoghi in cui un'annotazione di tipo esplicita potrebbe essere prudente.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.