Jump to content

Тип устройства

В области математической логики и информатики, известной как теория типов , единичный тип — это тип , который допускает только одно значение (и, следовательно, не может содержать никакой информации). Носитель (базовый набор), связанный с типом единицы, может быть любым одноэлементным набором . Между любыми двумя такими множествами существует изоморфизм , поэтому принято говорить о типе единицы , игнорируя детали ее значения. Можно также рассматривать тип единицы как тип 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, обычно не сохраняются другими классами)

Примечания [ править ]

  1. ^ ван Россум, Гвидо; Левковский Иван. «PEP 483 — использование «Нет»» . Предложения по улучшению Python . Фонд программного обеспечения Python . Проверено 2 марта 2024 г.

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

Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 36d2b33ebd2d3321cebac981c0cfa7c7__1716643080
URL1:https://arc.ask3.ru/arc/aa/36/c7/36d2b33ebd2d3321cebac981c0cfa7c7.html
Заголовок, (Title) документа по адресу, URL1:
Unit type - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)