Проблема в том, что вывод типа HM в общем случае неразрешим в языке с субтипированием, перегрузкой или аналогичными функциями. Ref Это означает, что все больше и больше материала может быть добавлено в модуль вывода чтобы сделать вывод о более особых случаях, но всегда будет код, в котором он потерпит неудачу.
Scala приняла решение сделать обязательными аннотации типов в аргументах методов и некоторых других местах. Сначала это может показаться хлопотным, но учтите, что это помогает документировать код и предоставляет компилятору информацию, которую он может понять в одном месте. Кроме того, языки с выводом HM часто страдают от проблемы, заключающейся в том, что ошибки программирования иногда обнаруживаются в коде вдали от исходной ошибки, потому что алгоритм HM просто пошел и случайно (случайно) вывел другие части кода с ошибочным типом он сделал вывод, прежде чем потерпел неудачу.
Вывод Scala в основном работает извне (определение метода) внутрь (код внутри метода) и поэтому ограничивает влияние неправильной аннотации типа.
Языки с выводом HM работают изнутри наружу (игнорируя возможность добавления аннотаций типов), что означает, что есть вероятность, что небольшое изменение кода в одном методе может изменить смысл всей программы. Это может быть хорошо или плохо.
Ссылка: Lower bounds on type inference with subtypes