Нет, компилятор не распознает бесконечно циклические функции. На самом деле известно, что это невозможно - см. Проблема остановки .
Подпись действительна, потому что в теле функции нет ничего, что определяло бы (или оказывало бы какое-либо влияние), каким должен быть возвращаемый тип. Следовательно, тип возвращаемого значения может быть любым. Так просто.
Смысл Void
в том, что это тип, который вообще не может иметь никаких значений. Как пустой набор. В этом случае это свойство достигается с помощью хитрой хитрости: заставить каждое значение Void
содержать другое значение Void
, что делает невозможным построение значения Void
. Это означает, что для всех практических целей тип Void
не может иметь никаких значений.
Соответствующая функция absurd
- это функция, которая никогда не может быть вызвана. Это свойство следует из функции, принимающей Void
в качестве аргумента. Поскольку не может быть значений типа Void
, невозможно предоставить аргументы для такой функции и, следовательно, ее невозможно вызвать. Такая функция полезна в некоторых случаях с очень высокими краями бровей, но в основном это теоретическое любопытство.