Какие ограничения scala размещаются на "приемлемой сложности" предполагаемых типов?

В соответствии с Scala Language Spec:

... вывод локального типа разрешен для ограничения сложности выведенных границ [параметров типа]. Минимальные и максимальные типы должны быть поняты по отношению к набору типов приемлемой сложности.

На практике, каковы пределы?

Кроме того, существуют ли разные ограничения, применимые к типам выведенных выражений, чем к ограничениям типа параметра и каковы эти пределы?

Ответ 1

При выводе типов компилятор часто должен рассчитать наименьшую верхнюю границу (LUB) списка типов. Например, тип if (cond) e1 else e1 - это LUB типов e1 и e1.

Эти типы могут быть довольно большими, например, попробовать это в 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]...

Этот commit ввел некоторые проверки здравомыслия, чтобы ограничить глубину таких предполагаемых типов.

Была проведена некоторая недавняя работа по подключению к процессу компиляции для обнаружения выведенных типов, которые занимают много времени для расчета, и предлагают места, где явная аннотация типа может быть разумной.