Відповідь Карла хороша. Ось додаткове використання, яке, я думаю, ніхто ще не згадував. Тип
if E then A else B
повинен бути тип, який включає всі значення у типі Aта всі значення у типі B. Якщо тип Bє Nothing, то типом ifвиразу може бути тип A. Я часто оголошую рутину
def unreachable( s:String ) : Nothing = throw new AssertionError("Unreachable "+s)
сказати, що не очікується досягнення коду. Оскільки його тип є Nothing, unreachable(s)тепер його можна використовувати будь-який ifабо (частіше), switchне впливаючи на тип результату. Наприклад
val colour : Colour := switch state of
BLACK_TO_MOVE: BLACK
WHITE_TO_MOVE: WHITE
default: unreachable("Bad state")
У Scala такий тип Нічого.
Іншим випадком використання Nothing(як згадується у відповіді Карла) є Список [Нічого] - це список списків, кожен з членів яких має тип Нічого. Таким чином, це може бути тип порожнього списку.
Ключова властивість , Nothingщо робить ці випадки використання роботи НЕ що не має значення --although в Scala, наприклад, він є нічим values-- це те , що вона є підтипом будь-якого іншого типу.
Припустимо, у вас є мова, де кожен тип містить однакове значення - назвемо це (). У такій мові тип одиниці, який має ()єдине значення, може бути підтипом кожного типу. Це не робить його нижчим типом у тому сенсі, що це означало ОП; в ОП було зрозуміло, що нижній тип не містить значень. Однак, оскільки це тип, який є підтипом кожного типу, він може грати майже таку ж роль, як і нижній тип.
Haskell робить щось трохи інакше. У Haskell вираз, який ніколи не створює значення, може мати типову схему forall a.a. Екземпляр цієї схеми типів буде уніфікований з будь-яким іншим типом, тому він ефективно діє як нижній тип, хоча (стандартний) Haskell не має поняття підтипу. Наприклад, errorфункція зі стандартної прелюдії має схему типу forall a. [Char] -> a. Тож можна писати
if E then A else error ""
і тип виразу буде таким самим, як і тип Aдля будь-якого виразу A.
Порожній список в Haskell має типову схему forall a. [a]. Якщо Aце вираз, тип якого - тип списку, то
if E then A else []
- це вираз того ж типу, що і A.
voidдані ...