Что означает «отсутствие глобального вывода типа» в отношении Scala? - PullRequest
13 голосов
/ 29 ноября 2010

Я читал, что логический тип Scala не является глобальным, поэтому люди должны размещать аннотации типов в методах.(Будет ли это «локальный» вывод типа?)

Я лишь немного понимаю, что причина в его объектно-ориентированной природе, но ясность ускользает от меня.Есть ли объяснение «глобальному выводу типа» и почему Scala не может иметь его, чтобы его мог понять новичок?

Ответы [ 2 ]

22 голосов
/ 29 ноября 2010

Проблема в том, что вывод типа HM в общем случае неразрешим в языке с субтипированием, перегрузкой или аналогичными функциями. Ref Это означает, что все больше и больше материала может быть добавлено в модуль вывода чтобы сделать вывод о более особых случаях, но всегда будет код, в котором он потерпит неудачу.

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

Вывод Scala в основном работает извне (определение метода) внутрь (код внутри метода) и поэтому ограничивает влияние неправильной аннотации типа.

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


Ссылка: Lower bounds on type inference with subtypes

16 голосов
/ 29 ноября 2010

Типичный пример для глобального вывода типа: Хиндли-Милнер : он берет данную программу и «вычисляет» все необходимые типы. Однако, чтобы достичь этого, данный язык должен иметь некоторые свойства (существуют расширения для HM, которые пытаются преодолеть некоторые из этих ограничений). HM не любит две вещи: наследование и перегрузка методов. Насколько я понимаю, это основные препятствия для Scala, чтобы принять HM или какой-то другой вариант. Обратите внимание, что на практике даже языки, которые сильно зависят от HM, никогда не достигают 100% -ного вывода, например даже в Haskell время от времени вам нужна аннотация типа.

Так что Scala использует более ограниченную (как вы говорите «локальную») форму вывода типов, которая все же лучше, чем ничего. Насколько я могу судить, команда Scala пытается улучшить вывод типов от выпуска к выпуску, когда это возможно, но пока я видел только меньшие шаги. Разрыв в средстве вывода типа HM по-прежнему огромен и не может быть полностью закрыт.

...