Предполагаемый тип бесконечно рекурсивной функции

Для цикла, как показано ниже:

let rec loop () = loop ()

подпись в соответствии с try.ocamlpro.com:

val loop : unit -> 'a = <fun>

Почему это так? loop() никогда не прекращает вызывать себя, не должен ли он ничего возвращать?

2 ответа

Решение

Я уверен, что кто-то может и будет точно объяснить, как это делается, но это свойство системы типов Хиндли-Милнера и ее алгоритма вывода, что он сможет вывести наиболее общий тип выражения. И это конечно 'a, который объединится с чем угодно.

Итак, просто интуитивно, если вы начнете с самого общего типа, 'a, затем попытайтесь найти ограничения, которые сужают это, вы ничего не найдете в этом случае. Единственное выражение, которое может ограничить его, - это рекурсивный вызов, который мы уже предполагаем, 'aтак что конфликта нет.

Да, так и должно быть, и это именно то, что unit -> 'a означает: дано любого типа 'a вызывающая сторона запрашивает, функция обещает вернуть 'a,

Другие вопросы по тегам