Есть ли система вывода типов, которая работает во всех случаях? - PullRequest
0 голосов
/ 01 апреля 2020

Существует ли какой-либо алгоритм вывода типа, который всегда (или почти всегда) выводит правильный тип? Я знаю, что алгоритм Хиндли Милнера может сделать это во многих случаях, но не во всех (т. Е. У полиморфных типов более высокого ранга c типов).

1 Ответ

0 голосов
/ 02 апреля 2020

Ваш вопрос не совсем корректен, потому что набор "всех случаев" не совсем четко определен.

Например, вы упоминаете полиморфные типы c более высокого ранга как случай, когда вывод типа Хиндли-Милнера не всегда может вывести правильный тип, что верно, за исключением того, что существуют языки, такие как Standard ML и Haskell, которые используют вывод типа Хиндли-Милнера и не имеют полиморфы высшего ранга c типов. Фактически, алгоритмы Хиндли-Милнера do работают во всех случаях, охватываемых системой типов Хиндли-Милнера; то есть система Хиндли-Милнера допускает именно те типы, которые могут быть выведены с помощью алгоритмов вывода типов Хиндли-Милнера, и поэтому явные аннотации типов никогда не требуются в этой системе.

Конечно, в реальных языках, использующих Хиндли-Милнер обычно расширяет систему различными способами по прагматическим c причинам, и некоторые из этих расширений приводят к случаям, которые алгоритм не охватывает. (Например, Standard ML имеет некоторые встроенные перегруженные идентификаторы, такие как + : real * real -> real и + : int * int -> int, что означает, что программистам иногда нужно использовать явные аннотации типов для выбора правильной перегрузки.) Но это решение проекта не необходимость; и я замечаю, что вы, во всяком случае, не упоминаете никаких языков реального мира в своем вопросе.

Но из вашего вопроса вы, похоже, хотите, чтобы хотя бы все Хиндли-Милнера плюс выше полиморфный тип c. Это означает, что вы хотите по крайней мере все Система F , лямбда-исчисление полиморфизма c. И вывод типа в Системе F, как известно, неразрешим. Это означает, что ответом на ваш вопрос является «нет»: ни один алгоритм вывода типов не может вывести правильные типы для всех случаев, которые вам нужны.

...