Карл ответил хорошо. Вот еще одно использование, которое, я думаю, никто не упомянул. Тип
if E then A else B
должен быть тип, который включает в себя все значения в типе Aи все значения в типе B. Если тип Bis 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(как упоминалось в ответе Карла) - List [Nothing] - это тип списков, каждый из членов которых имеет тип Nothing. Таким образом, это может быть тип пустого списка.
Ключевое свойство Nothingэтого делает эти варианты использования работающими не в том, что у него нет значений - хотя в Scala, например, у него нет значений - это в том, что он является подтипом любого другого типа.
Предположим, у вас есть язык, в котором каждый тип содержит одно и то же значение - давайте назовем его (). В таком языке тип модуля, который имеет ()единственное значение, может быть подтипом каждого типа. Это не делает его типом дна в том смысле, что имел в виду ОП; ОП было ясно, что тип дна не содержит значений. Однако, поскольку это тип, который является подтипом каждого типа, он может играть почти ту же роль, что и нижний тип.
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данные ...