Какие ограничения scala накладывает на "приемлемую сложность" выводимых типов?
по словам Спецификация Языка Scala:
... вывод локального типа разрешается ограничивать сложность выводимого границы [параметров типа]. Минимальность и максимальность типов должны быть поняты относительно набора типов допустимой сложности.
на практике каковы пределы?
кроме того, существуют ли различные ограничения, которые применяются к выводимым типам выражений, чем к границам типа параметров, и что это за пределы?
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 введены некоторые проверки здравомыслия, чтобы ограничить глубину таких выводимых типов.
в последнее время была проведена работа по подключению к процессу компиляции чтобы обнаружить выводимые типы, которые занимают много времени для вычисления, и предложить места, где явная аннотация типа может быть разумной.