Never type — это тип, не имеющий ни одного значения, то есть по сути является пустым множеством. В язык программирования используется для обозначения невозможности вычисления (его завершения) и зачастую является bottom-типом.
Например, у нас есть функция exit
, что завершает исполнения нашей программы,
то есть функция никогда не завершиться! Вот реальная сигнатура std::process::exit
из стандартной библиотеке Rust1'а:
pub fn exit(code: i32) -> !
!
- литерал never-типа
fn main() -> Result<!, ExitCode> {
// ...
}
В ML языках (например Haskell) так таковой never-тип не используется, сигнатура
той же функции exit
в стандартной библиотеке Haskell'я выглядит так:
exitWith :: ExitCode -> IO a
a
- переменная типа
Здесь используется return-type полиморфизм, что с точки зрения типов будет иметь похожий эффект как и never-тип.
isOneOrDie :: Int -> IO String
isOneOrDie 1 = pure "ok"
isOneOrDie _ = die "💀"
- StackOverflow Why does Rust have a "Never" primitive type?
- Rust never type
- Хабр "TypeScript. Мощь never"
Footnotes
-
На момент весны 2023 года,
rustc 1.69.0
, never type в Rust не является first-class типом, то есть его нельзя использовать в композиции с другими типами. Например:Result<!, E>
. Однако, это верно только для стабильной версии компилятора, так как nightly имеют экспериментальную поддержку. ↩