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

122

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

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

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

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

  • 2
    в этом блоге есть интересная дискуссия на эту тему
  • 0
    Да, в нем упоминается один тип типа, который Scala откажется выводить: частично примененный конструктор типов. Интересно, есть ли другие?
Показать ещё 5 комментариев
Теги:
type-inference

1 ответ

10
Лучший ответ

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню