Skip to content

Latest commit

 

History

History
52 lines (39 loc) · 2.43 KB

NeverType.md

File metadata and controls

52 lines (39 loc) · 2.43 KB

Never Type

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 "💀"

Ссылки


Footnotes

  1. На момент весны 2023 года, rustc 1.69.0, never type в Rust не является first-class типом, то есть его нельзя использовать в композиции с другими типами. Например: Result<!, E>. Однако, это верно только для стабильной версии компилятора, так как nightly имеют экспериментальную поддержку.