Карл ответил хорошо. Вот еще одно использование, которое, я думаю, никто не упомянул. Тип
if E then A else B
должен быть тип, который включает в себя все значения в типе A
и все значения в типе B
. Если тип B
is 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
данные ...