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


120

Согласно спецификации языка Scala :

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

На практике каковы ограничения?

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


2
в этом блоге есть интересные обсуждения на эту тему
Джамиль

20
Я бы посоветовал отправить сообщение в
Дэйв Л.

1
Я не уверен, но думаю, это означает, например, что у нас есть список строк, и мы добавляем к нему int. Возвращаемый неизменяемый список в конечном итоге имеет тип «Любой». Итак максимальность типов
Jatin

8
На самом деле это подвижная цель, поскольку разные версии компилятора Scala имеют разные ограничения. Это изменилось, и я ожидаю, что это будет продолжаться по крайней мере в ближайшем будущем, поскольку язык продолжает развиваться. Я голосую против этого вопроса, потому что на него нельзя ответить в том виде, в котором он сейчас сформулирован.
Кевин Ситце

1
@kevin Верно. Полагаю, меня больше всего интересует scala 2.9, так как он недавний, но стабильный. Но мне интересно, насколько это изменится.
Оуэн,

Ответы:


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]...

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.