Читаю про вывод типов, и возник вопрос по этому абзацу:
По-существу, Хиндли-Милнер (или «Дамас-Милнер») это алгоритм для вывода типов значений на основании того, как они используются. Буквально, он формализует интуитивное представление о том, что тип может быть выведен из поддерживаемых им операций. Рассмотрим следующий код на псевдо-Scala[4]:
def foo(s: String) = s.length // заметьте: без указания типов def bar(x, y) = foo(x) + y
Просто посмотрев на определение функции bar, мы можем сказать, что ее тип должен быть (String, Int)=>Int. Это не сложно вывести. Мы просто смотрим на тело функции и видим два способоа использовать параметры x и y. x передается в foo, который ожидает String. Следовательно x должен иметь тип String для того, чтобы этот код скомпилировался. Более того, foo возвращает значение типа Int. Метод + класса Int ожидает параметр, также Int, следовательно y должен быть типа Int. Наконец, мы знаем, что + возвращает Int, а значит это и есть тип, возвращаемый bar.
Но что будет в случае, если функция foo полиморфна, и принимает несколько типов, и если операцию + имеет не только число, но и строка? И еще несколько типов? Как же тогда можно вывести тип?