Что означает "глобальный тип вывода" в отношении Scala?
Я читал, что вывод типа Scala не является глобальным, поэтому люди должны размещать аннотации типа для методов. (Будет ли это "локальный" тип вывода?)
Я лишь немного понимаю, что причина связана с его объектно-ориентированным характером, но ясность ускользает от меня. Есть ли объяснение для "вывода глобального типа" и почему Scala не может иметь его, что может понять новичок?
Ответы
Ответ 1
Типичным примером для вывода глобального типа является Hindley-Milner: он принимает заданную программу и "вычисляет" все необходимые типы. Однако для достижения этого, данный язык должен обладать некоторыми свойствами (есть расширения для HM, которые пытаются преодолеть некоторые из этих ограничений). Две вещи, которые HM не нравится, - это наследование и перегрузка метода. Насколько я понимаю, это основные препятствия для Scala принятия HM или какого-либо его варианта. Отметим, что на практике даже языки, которые в значительной степени полагаются на HM, никогда не достигают 100% -ного вывода, например. даже в Haskell время от времени вам требуется аннотация типа.
Итак, Scala использует более ограниченную (как вы говорите, "локальную" ) форму вывода типа, которая по-прежнему лучше, чем ничего. Насколько я могу судить, команда Scala пытается улучшить вывод типа из релиза, чтобы освободить его, когда это возможно, но до сих пор я видел только более мелкие шаги. Разрыв в методе определения типа HM по-прежнему огромен и не может быть полностью закрыт.
Ответ 2
Проблема заключается в том, что вывод типа HM в общем случае неразрешим на языке с подтипированием, перегрузкой или аналогичными функциями. Ref Это означает, что все больше и больше вещей может быть добавлено к инференсеру, чтобы сделать его более сложным, но всегда будет код, в котором он будет терпеть неудачу.
Scala принял решение сделать аннотации типа в аргументах метода и в некоторых других местах обязательными. Сначала это может показаться неприятным, но подумайте, что это помогает документировать код и предоставляет компилятору информацию, которую он может понять в одном месте. Кроме того, языки с выводами HM часто страдают от проблемы, что ошибки программирования иногда обнаруживаются в коде далеко от первоначальной ошибки, потому что алгоритм HM просто прошел и случайно (случайно) вывел другие части кода с неисправным типом он выводил до того, как он не удался.
Вывод Scala в основном работает извне (определение метода) внутри (код внутри метода) и поэтому ограничивает влияние аннотации неправильного типа.
Языки с выводами HM работают изнутри наружу (игнорируя возможность добавления аннотаций типа), что означает вероятность того, что небольшое изменение кода в одном методе может изменить значение всей программы. Это может быть хорошим или плохим.
Ссылка: Lower bounds on type inference with subtypes