Вопрос

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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


Ref: Lower bounds on type inference with subtypes

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top