Одним з визначальних властивостей ⊥ або порожнього типу є те , що існує функція ⊥ → A для кожного типу А . Насправді існує унікальна така функція. Тому цілком розумно цю функцію надавати як частину стандартної бібліотеки. Часто його називають чимось подібним absurd
. (У системах з підтипом це може бути вирішено просто, маючи ⊥ бути підтипом кожного типу. Тоді неявна конверсія є absurd
. Іншим пов'язаним підходом є визначення ⊥ як ∀ α . α яке може бути просто інстанційним для будь-якого типу.)
Ви напевно хочете мати таку функцію або еквівалент, тому що саме це дозволяє використовувати функції, які виробляють ⊥ . Наприклад, припустимо, що я дав тип суму Е+ А . Я роблю аналіз справи на ньому, і у випадку Е я збираюся кинути виняток, використовуючи t h r o w :E→ ⊥ . В А разі, я буду використовувати f: A → B . В цілому, я хочу значення типу Б , так що мені потрібно зробити що - то , щоб перетворити ⊥ в Б . Ось що absurd
дозволило б мені зробити.
Це означає, що для визначення власних функцій ⊥ → A існує не так багато причин . За визначенням, вони обов'язково були б екземплярами absurd
. Тим не менш, ви можете зробити це, якщо absurd
це не передбачено стандартною бібліотекою, або ви хочете, щоб спеціальна версія для полегшення перевірки / умовиводу типу. Ви можете, однак, легко виробляти функції , які в кінцевому підсумку інстанціювати до типу як ⊥ → A .
Незважаючи на те, що не так багато причин писати таку функцію, вона, як правило, все-таки повинна бути дозволена . Однією з причин є те, що це спрощує засоби генерації коду / макроси.
(x ? 3 : throw new Exception())
замінюється для аналізу на щось подібне(x ? 3 : absurd(throw new Exception()))
?