Шаблон проектирования: позвольте компилятору выводить типы для ваших функций и убедитесь, что эти типы в точности соответствуют вашим ожиданиям. Если типы являются более полиморфными или менее полиморфными, выясните, почему.
Например, если вы пишете функцию сортировки в Haskell, ожидайте
Ord a => [a] -> [a]
Если ваш тип
Num a => [a] -> [a]
или
[a] -> b
тогда что-то ужасно не так.
Рекомендация: как только вы подтвердите компилятором, что тип соответствует вашему, поставит явную сигнатуру типа для каждой функции верхнего уровня . (Или, если вы используете ML или Caml, напишите явный интерфейс.) Установите параметры компилятора, чтобы значения с отсутствующими сигнатурами вызывали ошибку.