Тип-произведение
Тип-произведение (также Шаблон:Math-тип, произведение типов; Шаблон:Lang-en) — конструкция в языках программирования и интуиционистской теории типов, тип данных, построенный как декартово произведение исходных типов; другими словами — кортеж типов, или «кортеж как тип»Шаблон:Переход. Использованные типы и порядок их следования определяют Шаблон:Iw типа-произведения; порядок следования объектов в создаваемом кортеже сохраняется на протяжении его времени жизни согласно заданной сигнатуре.
Например, если типы A и B представляют собой множества значений a и b соответственно, то составленное из них декартово произведение записывается как A×B, и полученный тип-произведение представляет собой всё множество возможных пар (a,b).
Теоретическое и прикладное значение
В языках, использующих вызов по значению, тип-произведение может интерпретироваться как произведение в категории типов. В соответствии Карри-Ховарда типы-произведения соответствуют конъюнкции в логике (операции AND).
Частный случай произведения двух типов часто называют «парой» или более точно «упорядоченной парой». Произведение произвольного конечного количества типов называется «n-арным типом-произведением» или «кортежем из n типов». В русскоязычной литературе также присутствует вариант наименования «упорядоченная энка» (обобщение от «двойка», «тройка» и т. д.), лингвистически построенный по аналогии с английским термином «tuple» (см. [[:en:Tuple (computer science)|кортеж Шаблон:Ref-en]]).
Вырожденная форма типа-произведения — произведение нуля типов — представляет собой Шаблон:Iw (Шаблон:Lang-en, «тип юнит»), то есть тип, представленный единственным значением. Системы типов некоторых языков (например, Python) могут предусматривать один или несколько уникальных единичных типов, не совместимых с типом кортежа из нуля элементов.
Типы-произведения встроены в большинство функциональных языков программирования. Например, произведение type1× … × typen записывается как type1 * … * typen в ML или как (type1,…,typen) в Haskell. В обоих языках кортежи записываются как (v1,…,vn) и их компоненты извлекаются посредством сопоставления с образцом. В дополнение к этому большинство функциональных языков предоставляет алгебраические типы данных, расширяющие понятия как типа-произведения, так и типа-суммы. Алгебраические типы, заданные единственным конструктором, изоморфны типам-произведениям.
Кортеж типов как чистое воплощение типа-произведения служит формальным обоснованием для более часто встречающегося в языках составного типа «запись»Шаблон:Переход, хотя в некоторых языках реализованы оба контейнера. Разница обычно заключается в том, что кортежи задают и сохраняют порядок следования своих компонентов в памяти ЭВМ (это важно при обращении к их компонентам посредством адресной арифметики), но не предоставляют возможности доступа к ним посредством квалифицированных идентификаторов, а записи, наоборот, определяют идентификаторы, но не определяют порядок следования. Однако, есть исключения:
- в языке Standard ML кортежи значений с целью оптимизации размещения в памяти реализуются посредством записей, у которых в качестве идентификаторов компонентов используются их порядковые номера в кортеже; адресная арифметика недоступна; типы перестают существовать после компиляции; и требуемый порядок следования принуждается только при Шаблон:Iw.
- в языке Си тип данных «структура» (
struct)Шаблон:Переход соединяет в себе свойства записей и кортежей, то есть позволяет назначать компонентам идентификаторы и одновременно гарантирует сохранение порядка их следования. Кроме того, в отличие от записей и кортежей, структуры в Си могут содержать указатели на собственные объекты, что позволяет непосредственно строить Шаблон:Iw.
Реализация в языках программирования
Шаблон:Якорь Кортежи
Шаблон:Якорь Записи
Шаблон:Main Во многих языках запись представляет собой агрегатный тип данных, инкапсулирующий без сокрытия набор значений различных типов.
В одних языках (например, в Си или Паскале) порядок размещения значений в памяти задаётся при определении типа и сохраняется на протяжении времени жизни объектов, что даёт возможность косвенного доступа (например, через указатели); в других языках (например, в ML) порядок размещения не определён, так что доступ к значениям возможен только по квалифицированному идентификатору. В некоторых языках, хотя порядок следования и сохраняется, но выравнивание контролируется компилятором, так что использование адресной арифметики может оказаться платформенно-зависимым. Некоторые языки позволяют присваивание между экземплярами разных записей, игнорируя различия в идентификаторах компонентов записей, и основываясь только на порядке следования. Другие языки, напротив, учитывают только совпадение имён, разрешая различия в порядке их определения.
Впервые записи были представлены в языке Кобол, где они имели довольно сложную нотацию. При проверке согласования типов, Кобол учитывает только совпадение имён полей записей и не учитывает совпадение порядка их следования.
Кортежи служат формальным обоснованием записей в теории типов. В то же время, в языках кортежи временами могут реализовываться посредством записей, использующих в качестве идентификаторов индексные номера полей в получаемом кортеже.
Шаблон:Якорь Структуры в Си
Шаблон:Main
В языке Си, структура (struct) — композитный тип данных, инкапсулирующий без сокрытия набор значений различных типов. Порядок размещения значений в памяти задаётся при определении типа и сохраняется на протяжении времени жизни объектов, что даёт возможность косвенного доступа (например, через указатели).
Примечания
| {{#switch: {{{1}}}
| узкие = columns reflist-narrow
| широкие = columns reflist-wide
| #default = columns
}}
| {{#switch: {{{1}}}
| 1 =
| 2 | 3 = columns
| #default = columns reflist-narrow
}}
}}
| columns
}}
}}" style="{{#if:
| column-width:{{{colwidth}}};
| {{#if:
| {{#iferror: {{#ifexpr: {{{1}}} > 1 }}
| {{#switch: {{{1}}}
| узкие | широкие =
| #default = column-width:{{{1}}};
}}
}}
}}
}} list-style-type: {{#switch:
| upper-alpha
| upper-roman
| lower-alpha
| lower-greek
| lower-roman = {{{group}}}
| #default = decimal
}};">
<references group="" responsive="{{#if:
| 0
| {{#if:
| {{#iferror: {{#expr: {{{1}}} > 1 }}
| {{#switch: {{{1}}}
| узкие | широкие = 1
| #default = 0
}}
| {{#switch: {{{1}}}
| 1 = 0
| #default = 1
}}
}}
| 1
}}
}}"></references>Ошибка скрипта: Модуля «Check for unknown parameters» не существует.
Ссылки
- {{#if:|'
}}{{#if:http://homotopytypetheory.org/2013/06/20/the-hott-book/
| Homotopy Type Theory: Univalent Foundations of Mathematics, section 1.5 | Homotopy Type Theory: Univalent Foundations of Mathematics, section 1.5
}}{{#if:en
| {{#ifexist: Шаблон:ref-en
| Шаблон:Ref-en
| (en)
}}
}}{{#if:| = {{{оригинал}}} }}{{#switch:{{#if:|а}}{{#if:|и}}
|аи= // {{{автор издания}}} {{{издание}}}
|а= // {{{автор издания}}}
|и= // {{{издание}}}
}}{{#if:| : {{{тип}}} }}{{#if:| / {{{ответственный}}} }}.{{#switch:{{#if:|м}}{{#if:The Univalent Foundations Program, Institute for Advanced Study|и}}{{#if:|г}}
|миг= — {{#if:{{{место}}}|{{#switch:{{{место}}}|L.|N. Y.|P.|Б.|Б. м.|Ер.|Иер.|К.|Каз.|Л.|М.|Мн.|Н. Н.|Н. Новгород|Пг.|Ростов н/Д|СПб.|Тб.|Тф.|Яр.={{ {{{место}}} }}|{{{место}}}}} }}: The Univalent Foundations Program, Institute for Advanced Study, {{{год}}}.
|ми= — {{#if:{{{место}}}|{{#switch:{{{место}}}|L.|N. Y.|P.|Б.|Б. м.|Ер.|Иер.|К.|Каз.|Л.|М.|Мн.|Н. Н.|Н. Новгород|Пг.|Ростов н/Д|СПб.|Тб.|Тф.|Яр.={{ {{{место}}} }}|{{{место}}}}} }}: The Univalent Foundations Program, Institute for Advanced Study.
|мг= — {{#if:{{{место}}}|{{#switch:{{{место}}}|L.|N. Y.|P.|Б.|Б. м.|Ер.|Иер.|К.|Каз.|Л.|М.|Мн.|Н. Н.|Н. Новгород|Пг.|Ростов н/Д|СПб.|Тб.|Тф.|Яр.={{ {{{место}}} }}|{{{место}}}}} }}, {{{год}}}.
|иг= — The Univalent Foundations Program, Institute for Advanced Study, {{{год}}}.
|м= — {{#if:{{{место}}}|{{#switch:{{{место}}}|L.|N. Y.|P.|Б.|Б. м.|Ер.|Иер.|К.|Каз.|Л.|М.|Мн.|Н. Н.|Н. Новгород|Пг.|Ростов н/Д|СПб.|Тб.|Тф.|Яр.={{ {{{место}}} }}|{{{место}}}.}} }}
|и= — The Univalent Foundations Program, Institute for Advanced Study.
|г= — {{{год}}}.
}}{{#if:| — В. {{{выпуск}}}.
}}{{#if:| — Vol. {{{volume}}}. }}{{#if:| — Band {{{band}}}. }}{{#if:| — Т. {{{том}}}.
}}{{#if:| — № {{{номер}}}.
}}{{#if:| — С. {{{страницы}}}. }}{{#if:| — P. {{{pages}}}. }}{{#if: | — S.</nowiki> {{{seite}}}.
}}{{#if:| — ISBN {{{isbn}}}. }}{{#if:| — ISSN Шаблон:ISSN search link. }}{{#if:| — Шаблон:DOI }}{{#if:| — Шаблон:Bibcode }}{{#if:| — Шаблон:Arxiv }}{{#if: | — PMID {{{pmid}}}. }}{{#if:
| [{{{archiveurl}}} Архивировано] из первоисточника {{#iferror: {{#time: j xg Y | {{{archivedate}}}}} | {{{archivedate}}}}}.
}}{{#if:
|
}}{{#if:
|
}}
- {{#if:Роберт Харпер|Роберт Харпер }}{{#if: |{{#if: |[{{{ссылка часть}}} {{{часть}}}]| {{{часть}}}}} // }}{{#if:|[[:s:{{{викитека}}}|Введение в Стандартный ML]]|{{#if:|[ Введение в Стандартный ML]|Введение в Стандартный ML}}}}{{#if:| = {{{оригинал}}} }}{{#if:| / {{{ответственный}}}.|{{#if:||.}}}}{{#if:Введение в Стандартный ML|{{#if:| {{#if:| = {{{оригинал2}}} }}{{#if:| / {{{ответственный2}}}.|{{#if:||.}}}}}}}}{{#if:| — {{{издание}}}.}}{{#switch:{{#if:|м}}{{#if:Carnegie Mellon University|и}}{{#if:1986|г}}
|миг= — {{#if:{{{место}}}|{{#switch:{{{место}}}|L.|N. Y.|P.|Б.|Б. м.|Ер.|Иер.|К.|Каз.|Л.|М.|Мн.|Н. Н.|Н. Новгород|Пг.|Ростов н/Д|СПб.|Тб.|Тф.|Яр.={{ {{{место}}} }}|{{{место}}}}} }}: Carnegie Mellon University, 1986.
|ми= — {{#if:{{{место}}}|{{#switch:{{{место}}}|L.|N. Y.|P.|Б.|Б. м.|Ер.|Иер.|К.|Каз.|Л.|М.|Мн.|Н. Н.|Н. Новгород|Пг.|Ростов н/Д|СПб.|Тб.|Тф.|Яр.={{ {{{место}}} }}|{{{место}}}}} }}: Carnegie Mellon University.
|мг= — {{#if:{{{место}}}|{{#switch:{{{место}}}|L.|N. Y.|P.|Б.|Б. м.|Ер.|Иер.|К.|Каз.|Л.|М.|Мн.|Н. Н.|Н. Новгород|Пг.|Ростов н/Д|СПб.|Тб.|Тф.|Яр.={{ {{{место}}} }}|{{{место}}}}} }}, 1986.
|иг= — Carnegie Mellon University, 1986.
|м= — {{#if:{{{место}}}|{{#switch:{{{место}}}|L.|N. Y.|P.|Б.|Б. м.|Ер.|Иер.|К.|Каз.|Л.|М.|Мн.|Н. Н.|Н. Новгород|Пг.|Ростов н/Д|СПб.|Тб.|Тф.|Яр.={{ {{{место}}} }}|{{{место}}}.}} }}
|и= — Carnegie Mellon University.
|г= — 1986.
}}{{#if:| — {{{том как есть}}}.}}{{#if:| — Т. {{{том}}}.}}{{#if:| — Vol. {{{volume}}}.}}{{#if:| — B. {{{band}}}.}}{{#if:| — {{{страницы как есть}}}.}}{{#if:| — С. {{{страницы}}}.}}{{#if:| — {{{страниц как есть}}}.}}{{#if:97| — 97 с.}}{{#if:| — P. {{{pages}}}.}}{{#if:| — S. {{{seite}}}.}}{{#if:| — p.}}{{#if:| — s.}}{{#if:| — ({{{серия}}}).}}{{#if:| — Шаблон:Nobr}}{{#if:PA 15213-3891| — ISBN PA 15213-3891}}
- {{#if:Эммануэль Шалуа, Паскаль Манури, Бруно Пагано|Эммануэль Шалуа, Паскаль Манури, Бруно Пагано }}{{#if: |{{#if: |[{{{ссылка часть}}} {{{часть}}}]| {{{часть}}}}} // }}{{#if:|[[:s:{{{викитека}}}|Разработка программ с помощью Objective Caml]]|{{#if:|[ Разработка программ с помощью Objective Caml]|Разработка программ с помощью Objective Caml}}}}{{#if:| = {{{оригинал}}} }}{{#if:| / {{{ответственный}}}.|{{#if:||.}}}}{{#if:Разработка программ с помощью Objective Caml|{{#if:| {{#if:| = {{{оригинал2}}} }}{{#if:| / {{{ответственный2}}}.|{{#if:||.}}}}}}}}{{#if:| — {{{издание}}}.}}{{#switch:{{#if:|м}}{{#if:|и}}{{#if:2007|г}}
|миг= — {{#if:{{{место}}}|{{#switch:{{{место}}}|L.|N. Y.|P.|Б.|Б. м.|Ер.|Иер.|К.|Каз.|Л.|М.|Мн.|Н. Н.|Н. Новгород|Пг.|Ростов н/Д|СПб.|Тб.|Тф.|Яр.={{ {{{место}}} }}|{{{место}}}}} }}: , 2007.
|ми= — {{#if:{{{место}}}|{{#switch:{{{место}}}|L.|N. Y.|P.|Б.|Б. м.|Ер.|Иер.|К.|Каз.|Л.|М.|Мн.|Н. Н.|Н. Новгород|Пг.|Ростов н/Д|СПб.|Тб.|Тф.|Яр.={{ {{{место}}} }}|{{{место}}}}} }}: .
|мг= — {{#if:{{{место}}}|{{#switch:{{{место}}}|L.|N. Y.|P.|Б.|Б. м.|Ер.|Иер.|К.|Каз.|Л.|М.|Мн.|Н. Н.|Н. Новгород|Пг.|Ростов н/Д|СПб.|Тб.|Тф.|Яр.={{ {{{место}}} }}|{{{место}}}}} }}, 2007.
|иг= — , 2007.
|м= — {{#if:{{{место}}}|{{#switch:{{{место}}}|L.|N. Y.|P.|Б.|Б. м.|Ер.|Иер.|К.|Каз.|Л.|М.|Мн.|Н. Н.|Н. Новгород|Пг.|Ростов н/Д|СПб.|Тб.|Тф.|Яр.={{ {{{место}}} }}|{{{место}}}.}} }}
|и= — .
|г= — 2007.
}}{{#if:| — {{{том как есть}}}.}}{{#if:| — Т. {{{том}}}.}}{{#if:| — Vol. {{{volume}}}.}}{{#if:| — B. {{{band}}}.}}{{#if:| — {{{страницы как есть}}}.}}{{#if:| — С. {{{страницы}}}.}}{{#if:| — {{{страниц как есть}}}.}}{{#if:| — с.}}{{#if:| — P. {{{pages}}}.}}{{#if:| — S. {{{seite}}}.}}{{#if:| — p.}}{{#if:| — s.}}{{#if:| — ({{{серия}}}).}}{{#if:| — Шаблон:Nobr}}{{#if:| — ISBN }}
