Одним из определяющих свойств или пустого типа является то , что существует функция для каждого типа . На самом деле, существует уникальная такая функция. Поэтому вполне разумно, чтобы эта функция предоставлялась как часть стандартной библиотеки. Часто это называется что-то вроде . (В системах с подтипами это может быть выполнено просто при наличии как подтипа каждого типа. Тогда подразумевается неявное преобразование . Другой связанный подход заключается в определении как который может быть просто создан для любой тип.)⊥⊥ → AA⊥ ⊥ ∀ α . αabsurd
⊥absurd
⊥∀α.α
Вы определенно хотите иметь такую функцию или эквивалент, потому что это то, что позволяет вам использовать функции, которые производят . Например, предположим, что я дал тип сумму . Я делаю анализ случая и в случае я собираюсь исключение, используя . В случае, я буду использовать . В целом, я хочу значение типа , так что мне нужно сделать что - то , чтобы превратить в . Это то, что позволило бы мне сделать.⊥E+AEthrow:E→⊥Af:A→BB⊥Babsurd
Тем не менее, есть не много причин , чтобы определить свои собственные функции . По определению они обязательно будут экземплярами . Тем не менее, вы можете сделать это, если это не предусмотрено стандартной библиотекой, или вам нужна специализированная версия типа, чтобы помочь проверке / выводу типа. Вы можете, однако, легко производить функции , которые в конечном итоге инстанцирован к типу как .⊥→A⊥ → Aabsurd
absurd
⊥→A
Хотя для написания такой функции нет особых оснований, ее, как правило, следует разрешить . Одна из причин заключается в том, что это упрощает инструменты генерации кода / макросы.
(x ? 3 : throw new Exception())
заменяется в целях анализа чем-то более похожим(x ? 3 : absurd(throw new Exception()))
?