Ограничения вывода типа в ML

Я читал анекдоты людей, которые использовали ML в промышленности, говоря, что довольно часто встречались ограничения на вывод типов и они должны использовать явные аннотации типов в своих программах. Может ли кто-нибудь привести явные примеры того, где вывод типа ML сталкивается с проблемами, и, возможно, объяснить, связаны ли ограничения с неразрешимостью?

2 ответа

Решение

Вероятно, дубликат этого вопроса / ответа. Быстрый ответ: Вывод типа Хиндли / Милнера (используемый в ML) ограничен полиморфизмом ранга 1, то есть полиморфные типы являются гражданами второго сорта системы типов, и, например, аргументы функций сами по себе не могут быть полиморфными. Вывод типа для более высокого ранга полиморфизма (как и System F, иначе полиморфное лямбда-исчисление), как известно, неразрешим.

Я не могу сейчас привести пример (это были месяцы, когда я не кодировал в Ocaml), но на практике может случиться, когда вы совершаете ошибку типа (т.е. передаете аргумент неправильного типа), особенно при использовании high-популярные функции, сообщения об ошибках типа могут появляться далеко от вашей реальной ошибки.

Чтобы смягчить это, у меня появилась привычка явно вводить большинство внутренних функций верхнего уровня, например

let f (x: int) : string = 
Другие вопросы по тегам