Название «пустой тип», возможно, сбивает с толку. Это означает, что, как вы говорите сами, тип не содержит значений . «Пустой» относится не к каким-либо отдельным значениям типа, а к типу в целом, который рассматривается как набор возможных значений. Таким образом, это не говорит что-то вроде «функция, void
возвращающая информацию не возвращает», но «не существует значения типа ⊥
».
Это означает, что функция, тип результата которой никогда не⊥
может завершаться. Если бы он завершился, если бы пришлось вернуть значение , но, ну, такого значения не существует.⊥
Это также означает, что даже невозможно обсудить, сколько информации будет содержать значение пустого типа, потому что такого значения нет. (Или, если хотите, бессмысленное утверждение типа «любое значение пустого типа содержит ровно 35093658 битов информации» является пусто верным.) Несколько полезно (хотя и не совсем правильно) думать о ⊥
значениях как о бесконечном количестве информации.
В то время как функция C с «возвратного типа» void
явно может вернуться, но не дает никакой информации в ее возвращаемое значение. Что ж, это именно то, что характеризует тип модуля: его значения не содержат никакой информации, потому что существует только одно такое значение (следовательно, вы всегда можете сказать, каким будет возвращаемое значение, даже не удосужившись когда-либо вызвать функцию).
Процитирую Конора Макбрайда (транслитерировано на C):
void
означает «скучно». Это означает скучный тип, который содержит одну вещь, также скучный. Ничего интересного не получится, сравнив один элемент скучного типа с другим, потому что нечего изучать элемент скучного типа, обращая на него внимание.
Это очень отличается от пустого типа [...]. Пустой тип очень увлекателен, потому что если кто-то когда-нибудь даст вам принадлежащую ему ценность, вы знаете, что вы уже мертвы и на небесах, и все, что вы хотите, принадлежит вам.