Відповідь Карла хороша. Ось додаткове використання, яке, я думаю, ніхто ще не згадував. Тип
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
дані ...