Предполагаемый тип бесконечно рекурсивной функции
Для цикла, как показано ниже:
let rec loop () = loop ()
подпись в соответствии с try.ocamlpro.com:
val loop : unit -> 'a = <fun>
Почему это так? loop() никогда не прекращает вызывать себя, не должен ли он ничего возвращать?
2 ответа
Я уверен, что кто-то может и будет точно объяснить, как это делается, но это свойство системы типов Хиндли-Милнера и ее алгоритма вывода, что он сможет вывести наиболее общий тип выражения. И это конечно 'a
, который объединится с чем угодно.
Итак, просто интуитивно, если вы начнете с самого общего типа, 'a
, затем попытайтесь найти ограничения, которые сужают это, вы ничего не найдете в этом случае. Единственное выражение, которое может ограничить его, - это рекурсивный вызов, который мы уже предполагаем, 'a
так что конфликта нет.
Да, так и должно быть, и это именно то, что unit -> 'a
означает: дано любого типа 'a
вызывающая сторона запрашивает, функция обещает вернуть 'a
,