Из Википедии, свободной энциклопедии
Перейти к навигации Перейти к поиску

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

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

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

На языках программирования [ править ]

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

  • В Haskell и Rust тип модуля вызывается, ()и его единственное значение также равно (), что отражает интерпретацию нулевого кортежа.
  • В потомках ML (включая OCaml , Standard ML и F # ) тип вызывается, unitно значение записывается как ().
  • В Scala вызывается тип модуля, Unitи его единственное значение записывается как ().
  • В Common Lisp тип с именем NULL представляет собой единичный тип, имеющий одно значение, а именно символ NIL . Его не следует путать с типом NIL , который является нижним типом .
  • В Python есть тип с именем, NoneTypeдопускающий единственное значение None.
  • В Swift тип модуля называется Voidor, ()и его единственное значение также равно (), что отражает интерпретацию нулевого кортежа.
  • В 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 , voidиспользуется для обозначения функции , которая делает что - нибудь полезное, или функцию , которая не принимает никаких аргументов не возвращать. Тип единицы в C концептуально аналогичен пустому struct, но структура без членов не разрешена в спецификации языка C (это разрешено в C ++). Вместо этого, ' void' используется таким образом, чтобы имитировать некоторые, но не все, свойства типа объекта, как подробно описано ниже. Как и большинство императивных языков, C допускает функции, которые не возвращают значение; они указаны как имеющие тип возврата void. Такие функции называются процедурами в других императивных языках, таких как Паскаль., где между функциями и процедурами проводится синтаксическое различие, а не различие между системами типов.

Разница в соглашении о вызовах [ править ]

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

недействительным  f ( недействительным )  {} недействительным  g ( недействительным )  {}int  main ( void ) {  f ( g ());  // ошибка времени компиляции  return  0 ; }

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

class  unit_type  {}; const  unit_type  the_unit ;unit_type  f ( unit_type )  {  вернуть  the_unit ;  } unit_type  g ( unit_type )  {  вернуть  the_unit ;  }int  main () {  f ( g ( the_unit ));  возврат  0 ; }

(Для краткости в приведенном выше примере нас не беспокоит, the_unitдействительно ли это синглтон ; подробности по этой проблеме см. В шаблоне синглтона .)

Разница в хранении [ править ]

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

В Generics [ править ]

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

общедоступный  статический  Void  f ( Void  x )  {  return  null ;  } общедоступный  статический  Void  g ( Void  x )  {  return  null ;  }public  static  void  main ( String []  args ) {  f ( g ( null )); }

См. Также [ править ]

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

Ссылки [ править ]

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