Тип объекта - Unit type

В районе математическая логика и Информатика известный как теория типов, а тип единицы это тип который допускает только одно значение (и, следовательно, не может содержать никакой информации). Носитель (базовый набор), связанный с типом единицы, может быть любым. одноэлементный набор. Существует изоморфизм между любыми двумя такими наборами, поэтому принято говорить о то тип единицы и игнорируйте детали его значения. Можно также рассматривать тип единицы как тип 0-кортежи, т.е. товар нет типов.

Тип юнита - конечный объект в категория типов и типизированных функций. Не следует путать с нуль или же нижний тип, который позволяет нет ценности и исходный объект в этой категории. Точно так же Булево это тип с два значения.

Тип агрегата реализован в большинстве функциональные языки программирования. В тип пустоты который используется в некоторых императивных языках программирования, выполняет некоторые из его функций, но поскольку его набор носителей пуст, он имеет некоторые ограничения (как подробно описано ниже).

В языках программирования

Несколько компьютеров языки программирования укажите тип блока, чтобы указать тип результата функция с единственной целью вызвать побочный эффект и тип аргумента функции, не требующей аргументов.

  • В Haskell и Ржавчина, тип агрегата называется () и его единственная ценность также (), отражая интерпретацию 0-кортежа.
  • В ML потомки (в том числе OCaml, Стандартный ML, и F # ) тип называется единица измерения но значение записывается как ().
  • В Scala, тип агрегата называется Единица измерения и его единственное значение записывается как ().
  • В Common Lisp названный тип НОЛЬ тип единицы измерения, имеющий одно значение, а именно символ Ноль. Это не следует путать с Ноль тип, какой нижний тип.
  • В Python, есть тип, называемый NoneType что позволяет использовать одно значение Никто.
  • В Быстрый, тип агрегата называется Пустота или же () и его единственная ценность также (), отражая интерпретацию 0-кортежа.
  • В Идти, тип агрегата записывается struct {} и его ценность struct {} {}.
  • В PHP, тип модуля называется null, единственное значение которого само по себе NULL.
  • В JavaScript, как null, так и undefined являются встроенными типами единиц.
  • в Котлин, Единица измерения синглтон только с одним значением: Единица измерения объект.
  • В Рубин, ноль единственный пример NilClass учебный класс.
  • В C ++, то std :: monostate Тип единицы измерения был добавлен в C ++ 17. Перед этим можно определить пользовательский тип единицы измерения, используя пустую структуру, такую ​​как struct empty {}.

Тип пустоты как тип юнита

В C, C ++, C #, D и Ява, пустота используется для обозначения функции, которая не возвращает ничего полезного, или функции, которая не принимает аргументов. Тип единицы в C концептуально похож на пустой структура, но структуры без членов не разрешены в спецификации языка C (это разрешено в C ++). Вместо, 'пустота'используется способом, имитирующим некоторые, но не все, свойства типа модуля, как подробно описано ниже. Как и большинство императивных языков, C допускает функции, не возвращающие значения; они указаны как имеющие тип возврата void. Такие функции называются процедурами в других императивных языках, например Паскаль, где между функциями и процедурами проводится синтаксическое различие, а не различие между системами типов.

Разница в соглашении о вызовах

Первое заметное различие между истинным типом модуля и типом void заключается в том, что тип модуля всегда может быть типом аргумента функции, но тип void не может быть типом аргумента в C, несмотря на то, что он может появляются как единственный аргумент в списке. Эту проблему лучше всего иллюстрирует следующая программа, которая является ошибкой времени компиляции в C:

пустота ж(пустота) {}пустота грамм(пустота) {}int главный(пустота){  ж(грамм()); // здесь ошибка времени компиляции  возвращаться 0;}

Эта проблема не возникает в большинстве случаев программирования на C, поскольку пустота type не несет информации, все равно передавать бесполезно; но это может возникнуть в общее программирование, например C ++ шаблоны, куда пустота должны рассматриваться иначе, чем другие типы. Однако в C ++ разрешены пустые классы, поэтому можно реализовать реальный тип модуля; приведенный выше пример становится компилируемым как:

учебный класс unit_type {};const unit_type Единица;unit_type ж(unit_type) { возвращаться Единица; }unit_type грамм(unit_type) { возвращаться Единица; }int главный(){  ж(грамм(Единица));  возвращаться 0;}

(Для краткости в приведенном выше примере нас не беспокоит, Единица действительно одиночка; видеть одноэлементный образец для получения подробной информации по этому вопросу.)

Разница в хранении

Второе заметное отличие состоит в том, что тип void особенный и никогда не может быть сохранен в тип записи, т.е. в структуре или классе в C / C ++. Напротив, тип единицы может храниться в записях на языках функционального программирования, т.е. он может отображаться как тип поля; указанная выше реализация типа единицы в C ++ также может быть сохранена. Хотя это может показаться бесполезной функцией, она позволяет, например, элегантно реализовать набор как карта к типу агрегата; при отсутствии типа единицы можно реализовать набор таким образом, сохранив некоторое фиктивное значение другого типа для каждого ключа.

В дженериках

В Java Generics параметры типа должны быть ссылочными типами. Тип оболочки Пустота часто используется, когда требуется параметр типа устройства. Хотя Пустота тип никогда не может иметь экземпляров, он имеет одно значение, ноль (как и все другие ссылочные типы), поэтому он действует как тип единицы. На практике любой другой тип, не являющийся экземпляром, например Математика, также можно использовать для этой цели, поскольку они также имеют ровно одно значение, ноль.

общественный статический Пустота ж(Пустота Икс) { возвращаться ноль; }общественный статический Пустота грамм(Пустота Икс) { возвращаться ноль; }общественный статический пустота главный(Нить[] аргументы){    ж(грамм(ноль));}

Смотрите также

  • Шаблон Singleton (где конкретный класс имеет только один экземпляр, но узкотипные ссылки на него, не допускающие значения NULL, обычно не поддерживаются другими классами)

Рекомендации

  • Пирс, Бенджамин С. (2002). Типы и языки программирования. MIT Press. С. 118–119. ISBN  0-262-16209-1.
  • тип единицы в nLab