Які межі визначає масштаб щодо "прийнятної складності" виведених типів?


120

Згідно зі специфікацією мови Scala :

... локальний тип висновку дозволений для обмеження складності виведених меж [параметрів типу]. Мінімальність і максимальність типів слід розуміти відносно набору типів прийнятної складності.

На практиці які межі?

Крім того, чи існують різні обмеження, які застосовуються до виведених типів виразів, ніж до меж типу параметрів, і які ці межі?


2
у цьому блозі є цікава дискусія на цю тему
Джаміль

20
Я б запропонував надсилати повідомлення до списку розсилки, на якому розміщена мова, що згадується тут: scala-lang.org/node/199
Дейв Л.

1
Я не впевнений, але я думаю, що це означає, наприклад, що у нас є список рядків, і ми додаємо до нього int. Повернений непорушний список в кінцевому рахунку типу "Будь-який". Тож максимальність типів
Ятін

8
Це насправді рухома ціль, оскільки різні версії компілятора Scala мають різні межі. Це змінилося, і, я думаю, буде продовжуватись змінюватися принаймні найближчим часом, оскільки мова продовжує розвиватися. Я голосую на це запитання, оскільки на нього не можна відповісти, як зараз зазначено.
Кевін Сітце

1
@kevin Справді. Мені здається, мене найбільше цікавить шкала 2.9, оскільки вона є недавньою, але стабільною. Але мені цікаво, наскільки це зміниться.
Оуен

Відповіді:


10

Якщо виводити типи, компілятору часто потрібно обчислити найменший верхній кордон (LUB) списку типів. Наприклад, тип if (cond) e1 else e1- це LUB типів e1і e1.

Ці типи можуть бути досить великими, наприклад спробуйте це у відповіді:

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