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


по словам Спецификация Языка Scala:

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

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

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

1 122

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 введены некоторые проверки здравомыслия, чтобы ограничить глубину таких выводимых типов.

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