Только если такого типа нет. Во всех остальных случаях алгоритм выводит наиболее общий тип выражения. Другое дело, что иногда требуется определить для выражения более конкретный тип (если более общий не подходит семантически). Тогда его задают вручную.
Когда я впервые заинтересовался этим алгоритмом, статья Даниэля Спивака мне очень помогла понять основы, и облегчила понимание более формального описания алгоритма.
Не раскрыта тема наследования. По крайней мере F# при коде насыщенном иерархиями наследования/коваринатностью ведет себя очень глухо (http://www.rsdn.ru/forum/decl/3789317.1.aspx)
В Nemerle ситуация лучше, вот о его алгоритме было бы интереснее почитать.
Мой друг без аккаунта на Хабре попросил запостить следующее (надеюсь, что это не является нарушением правил, поскольку песочницы для комментариев нет):
Алгоритм вывода для систем типов Хиндли-Милнера был придуман Дамасом и Милнером. Он подходит для некоторого ряда систем типов, которые обладают общими свойствами. Оригинальная система типов, с которой работали Хиндли и Милнер была простое типизированное лямбда-исчисление. Современные алгоритмы вывода типов в языках Haskell, Ocaml, Standard ML хоть и предназначены для работы с более мощными системами типов, в основе содержат тот же алгоритм.
Язык Scala же, напротив, имеет систему типов, для которой вывод типов по этому алгоритму невозможен. Поэтому она использует другой алгоритм, он придуман Пирсом (local type inference) и улучшен Одерским (colored local type inference). Поэтому иллюстрировать текст про алгоритм Хиндли-Милнера примерами на Скале нехорошо. Спиваку об этом, кстати, несколько раз написали в комментариях к исходному посту. Он ответил, что да, он это сейчас понимает, но на момент написания текста (2008-й год) он этого не знал и текст уже переделывать не станет.
Просто о Хиндли-Милнере