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