Тип устройства
В области математической логики и информатики, известной как теория типов , единичный тип — это тип , который допускает только одно значение (и, следовательно, не может содержать никакой информации). Носитель (базовый набор), связанный с типом единицы, может быть любым одноэлементным набором . Между любыми двумя такими множествами существует изоморфизм , поэтому принято говорить о типе единицы , игнорируя детали ее значения. Можно также рассматривать тип единицы как тип 0- кортежей , т.е. произведение без типов.
Тип модуля — это терминальный объект в категории типов и типизированных функций. Его не следует путать с нулевым или пустым типом , который не допускает никаких значений и является начальным объектом в этой категории. Аналогично, Boolean — это тип с двумя значениями.
Тип unit реализован в большинстве функциональных языков программирования. Тип void , который используется в некоторых императивных языках программирования, выполняет некоторые из своих функций, но поскольку его набор носителей пуст, он имеет некоторые ограничения (как подробно описано ниже).
В языках программирования [ править ]
Некоторые языки программирования предоставляют тип модуля для указания типа результата функции с единственной целью вызвать побочный эффект , а также тип аргумента функции, которая не требует аргументов.
- В Haskell , Rust и Elm тип модуля называется
()
и его единственная ценность также()
, отражающий интерпретацию 0-кортежа. - В потомках ML (включая OCaml , Standard ML и F# ) тип называется
unit
но значение записывается как()
. - В Scala тип единицы называется
Unit
и его единственное значение записывается как()
. - В Common Lisp тип с именем NULL — это тип единицы, который имеет одно значение, а именно символ НОЛЬ . Это не следует путать с NIL Тип , который является нижним типом .
- В Python есть тип под названием
NoneType
что позволяет использовать одно значениеNone
. В необязательных аннотациях статического типа Python этот тип представлен какNone
. [1] - В Swift тип единицы называется
Void
или()
и его единственная ценность также()
, отражающий интерпретацию 0-кортежа. - В Java тип единицы называется
Void
и его единственное значениеnull
. - В Go тип юнита прописан
struct{}
и его значениеstruct{}{}
. - В PHP тип единицы измерения называется null, единственным значением которого является NULL.
- В JavaScript оба
Null
(его единственное значениеnull
) иUndefined
(его единственное значениеundefined
) являются встроенными типами модулей. - в Котлине ,
Unit
является синглтоном только с одним значением:Unit
объект. - В Руби ,
nil
является единственным экземпляромNilClass
сорт. - В C ++
std::monostate
тип единицы измерения был добавлен в C++17. До этого можно определить тип пользовательского модуля, используя пустую структуру, напримерstruct empty{}
.
Тип пустоты как тип юнита [ править ]
В C , C++ C # , D и PHP , void
используется для обозначения функции, которая не возвращает ничего полезного, или функции, не принимающей аргументов. Тип единицы измерения в C концептуально аналогичен пустому элементу. struct
, но структура без членов не разрешена в спецификации языка C (это разрешено в C++). Вместо, ' void
' используется таким образом, чтобы имитировать некоторые, но не все свойства типа юнита, как подробно описано ниже. Как и большинство императивных языков, C допускает функции, которые не возвращают значение; они указаны как имеющие тип возврата void. Такие функции называются процедурами в других императивных языках, таких как Паскаль , где между функциями и процедурами проводится синтаксическое различие, а не различие в системе типов.
Разница в соглашении о вызовах [ править ]
Первое заметное различие между истинным типом модуля и типом void заключается в том, что тип модуля всегда может быть типом аргумента функции, но тип void не может быть типом аргумента в C, несмотря на то, что он может быть типом аргумента функции. отображаться как единственный аргумент в списке. Эту проблему лучше всего иллюстрирует следующая программа, которая представляет собой ошибку времени компиляции в C:
void f(void) {}
void g(void) {}
int main(void)
{
f(g()); // compile-time error here
return 0;
}
Эта проблема не возникает в большинстве случаев программирования на языке C, поскольку void
type не несет никакой информации, передавать его все равно бесполезно; но это может возникнуть в общем программировании , например, в шаблонах C++ , где void
к ним следует относиться иначе, чем к другим типам. Однако в C++ разрешены пустые классы, поэтому можно реализовать реальный тип модуля; приведенный выше пример становится компилируемым как:
class unit_type {};
const unit_type the_unit;
unit_type f(unit_type) { return the_unit; }
unit_type g(unit_type) { return the_unit; }
int main()
{
f(g(the_unit));
return 0;
}
(Для краткости: в приведенном выше примере нас не беспокоит, the_unit
на самом деле является синглтоном ; см . в шаблоне Singleton подробности по этой проблеме .)
Разница в хранении [ править ]
Второе заметное отличие состоит в том, что тип void является особенным и никогда не может быть сохранен в типе записи , то есть в структуре или классе в C/C++. Напротив, тип единицы измерения может храниться в записях функциональных языков программирования, т.е. он может отображаться как тип поля; приведенную выше реализацию типа единицы в C++ также можно сохранить. Хотя эта функция может показаться бесполезной, она позволяет, например, элегантно реализовать набор в виде сопоставления с типом устройства; даже при отсутствии типа модуля набор можно реализовать таким образом, сохраняя для каждого ключа некоторое фиктивное значение другого типа.
В дженериках [ править ]
В Java Generics параметры типа должны быть ссылочными типами. Тип оболочки Void
часто используется, когда необходим параметр типа устройства. Хотя Void
тип никогда не может иметь экземпляров, у него есть одно значение, null
(как и все другие ссылочные типы), поэтому он действует как тип единицы. На практике любой другой нереализуемый тип, например Math
, также могут быть использованы для этой цели, поскольку они также имеют ровно одно значение, null
.
public static Void f(Void x) { return null; }
public static Void g(Void x) { return null; }
public static void main(String[] args)
{
f(g(null));
}
Нулевой тип [ править ]
Статически типизированные языки присваивают тип каждому возможному выражению. Им необходимо связать тип с нулевым выражением. Тип будет определен для значения null и будет иметь только это значение.
Например, в D можно объявить функции, которые могут возвращать только значение null :
typeof(null) returnThatSpecialThing(){
return null;
}
null — единственное значение, которое может иметь typeof(null) — тип единицы измерения.
См. также [ править ]
- Шаблон Singleton (когда конкретный класс имеет только один экземпляр, но узкотипизированные ссылки, не допускающие значения NULL, обычно не сохраняются другими классами)
Примечания [ править ]
- ^ ван Россум, Гвидо; Левковский Иван. «PEP 483 — использование «Нет»» . Предложения по улучшению Python . Фонд программного обеспечения Python . Проверено 2 марта 2024 г.
Ссылки [ править ]
- Пирс, Бенджамин К. (2002). Типы и языки программирования . МТИ Пресс . стр. 118–119. ISBN 0-262-16209-1 .
- тип устройства в n Lab