<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>http://digida.mgpu.ru/index.php?action=history&amp;feed=atom&amp;title=%D0%A2%D0%B8%D0%BF-%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5</id>
	<title>Тип-произведение - История изменений</title>
	<link rel="self" type="application/atom+xml" href="http://digida.mgpu.ru/index.php?action=history&amp;feed=atom&amp;title=%D0%A2%D0%B8%D0%BF-%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5"/>
	<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%A2%D0%B8%D0%BF-%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5&amp;action=history"/>
	<updated>2026-04-10T08:11:15Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.44.0</generator>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%A2%D0%B8%D0%BF-%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5&amp;diff=4625&amp;oldid=prev</id>
		<title>Patarakin в 11:20, 19 октября 2022</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%A2%D0%B8%D0%BF-%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5&amp;diff=4625&amp;oldid=prev"/>
		<updated>2022-10-19T11:20:49Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Предыдущая версия&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Версия от 14:20, 19 октября 2022&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l2&quot;&gt;Строка 2:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 2:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Теоретическое и прикладное значение ==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;== Теоретическое и прикладное значение ==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;В языках, использующих [[вызов по значению]], тип-произведение может интерпретироваться как [[Произведение (теория категорий)|произведение в категории типов]]&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;. В\&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;В языках, использующих [[вызов по значению]], тип-произведение может интерпретироваться как [[Произведение (теория категорий)|произведение в категории типов]].  &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Кортеж типов как чистое воплощение типа-произведения служит формальным обоснованием для более часто встречающегося в языках составного типа «[[Запись (тип данных)|запись]]»{{переход|#Запись}}, хотя в некоторых языках реализованы оба контейнера. Разница обычно заключается в том, что кортежи задают и сохраняют порядок следования своих компонентов в памяти ЭВМ (это важно при обращении к их компонентам посредством [[Указатель (тип данных)#адресная арифметика|адресной арифметики]]), но не предоставляют возможности доступа к ним посредством квалифицированных идентификаторов, а записи, наоборот, определяют идентификаторы, но не определяют порядок следования&lt;/del&gt;.  &lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Кортеж типов как чистое воплощение типа-произведения служит формальным обоснованием для более часто встречающегося в языках составного типа, хотя в некоторых языках реализованы оба контейнера. Разница обычно заключается в том, что кортежи задают и сохраняют порядок следования своих компонентов в памяти ЭВМ (это важно при обращении к их компонентам посредством адресной арифметики), но не предоставляют возможности доступа к ним посредством квалифицированных идентификаторов, а записи, наоборот, определяют идентификаторы, но не определяют порядок следования. &lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;В одних языках (например, в [[&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Си (язык программирования)|&lt;/del&gt;Си]] или [[&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Паскаль (язык программирования)&lt;/del&gt;|Паскале]]) порядок размещения значений в памяти задаётся при определении типа и сохраняется на протяжении времени жизни объектов, что даёт возможность косвенного доступа (например, через [[Указатель (тип данных)|указатели]]); в других языках (например, в [[ML]]) порядок размещения не определён, так что доступ к значениям возможен только по квалифицированному идентификатору. В некоторых языках, хотя порядок следования и сохраняется, но [[Выравнивание данных|выравнивание]] контролируется компилятором, так что использование адресной арифметики может оказаться платформенно-зависимым. Некоторые языки позволяют присваивание между экземплярами разных записей, игнорируя различия в идентификаторах компонентов записей, и основываясь только на порядке следования. Другие языки, напротив, учитывают только совпадение имён, разрешая различия в порядке их определения.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;В одних языках (например, в [[Си]] или [[&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Pascal&lt;/ins&gt;|Паскале]]) порядок размещения значений в памяти задаётся при определении типа и сохраняется на протяжении времени жизни объектов, что даёт возможность косвенного доступа (например, через [[Указатель (тип данных)|указатели]]); в других языках (например, в [[ML]]) порядок размещения не определён, так что доступ к значениям возможен только по квалифицированному идентификатору. В некоторых языках, хотя порядок следования и сохраняется, но [[Выравнивание данных|выравнивание]] контролируется компилятором, так что использование адресной арифметики может оказаться платформенно-зависимым. Некоторые языки позволяют присваивание между экземплярами разных записей, игнорируя различия в идентификаторах компонентов записей, и основываясь только на порядке следования. Другие языки, напротив, учитывают только совпадение имён, разрешая различия в порядке их определения.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Впервые записи были представлены в языке [[Кобол]], где они имели довольно сложную нотацию. При проверке согласования типов, Кобол учитывает только совпадение имён полей записей и не учитывает совпадение порядка их следования.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Впервые записи были представлены в языке [[Кобол]], где они имели довольно сложную нотацию. При проверке согласования типов, Кобол учитывает только совпадение имён полей записей и не учитывает совпадение порядка их следования.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key digida:diff:1.41:old-4606:rev-4625:php=table --&gt;
&lt;/table&gt;</summary>
		<author><name>Patarakin</name></author>
	</entry>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%A2%D0%B8%D0%BF-%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5&amp;diff=4606&amp;oldid=prev</id>
		<title>Patarakin в 09:21, 19 октября 2022</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%A2%D0%B8%D0%BF-%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5&amp;diff=4606&amp;oldid=prev"/>
		<updated>2022-10-19T09:21:23Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;a href=&quot;http://digida.mgpu.ru/index.php?title=%D0%A2%D0%B8%D0%BF-%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5&amp;amp;diff=4606&amp;amp;oldid=4551&quot;&gt;Внесённые изменения&lt;/a&gt;</summary>
		<author><name>Patarakin</name></author>
	</entry>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%A2%D0%B8%D0%BF-%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5&amp;diff=4551&amp;oldid=prev</id>
		<title>Patarakin: 1 версия импортирована</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%A2%D0%B8%D0%BF-%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5&amp;diff=4551&amp;oldid=prev"/>
		<updated>2022-10-19T07:30:51Z</updated>

		<summary type="html">&lt;p&gt;1 версия импортирована&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Предыдущая версия&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Версия от 10:30, 19 октября 2022&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;4&quot; class=&quot;diff-notice&quot; lang=&quot;ru&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(нет различий)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;!-- diff cache key digida:diff:1.41:old-4550:rev-4551 --&gt;
&lt;/table&gt;</summary>
		<author><name>Patarakin</name></author>
	</entry>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%A2%D0%B8%D0%BF-%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5&amp;diff=4550&amp;oldid=prev</id>
		<title>ru_wikipedia&gt;WinterheartBot: Удаление шаблонов: {{нп5}}×1</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%A2%D0%B8%D0%BF-%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5&amp;diff=4550&amp;oldid=prev"/>
		<updated>2021-08-12T07:19:12Z</updated>

		<summary type="html">&lt;p&gt;Удаление шаблонов: {{нп5}}×1&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;Тип-произведение&amp;#039;&amp;#039;&amp;#039; (также {{math|Π}}&amp;#039;&amp;#039;-тип&amp;#039;&amp;#039;, &amp;#039;&amp;#039;произведение типов&amp;#039;&amp;#039;; {{lang-en|product type}}) — конструкция в [[язык программирования|языках программирования]] и [[Интуиционистская теория типов|интуиционистской теории типов]], [[тип данных]], построенный как [[декартово произведение]] исходных типов; другими словами — [[Кортеж (информатика)|кортеж]] типов, или «&amp;#039;&amp;#039;кортеж как тип&amp;#039;&amp;#039;»{{переход|#Кортеж}}. Использованные типы и порядок их следования определяют {{iw|Сигнатура типа|сигнатуру|en|Type signature}} типа-произведения; порядок следования объектов в создаваемом кортеже сохраняется на протяжении его времени жизни согласно заданной сигнатуре.&lt;br /&gt;
&lt;br /&gt;
Например, если типы &amp;lt;code&amp;gt;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;lt;/code&amp;gt; представляют собой множества значений &amp;lt;code&amp;gt;&amp;#039;&amp;#039;a&amp;#039;&amp;#039;&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;&amp;#039;&amp;#039;b&amp;#039;&amp;#039;&amp;lt;/code&amp;gt; соответственно, то составленное из них декартово произведение записывается как &amp;lt;code&amp;gt;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;lt;/code&amp;gt;×&amp;lt;code&amp;gt;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;lt;/code&amp;gt;, и полученный тип-произведение представляет собой всё множество возможных пар &amp;lt;code&amp;gt;(&amp;#039;&amp;#039;a&amp;#039;&amp;#039;,&amp;#039;&amp;#039;b&amp;#039;&amp;#039;)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Теоретическое и прикладное значение ==&lt;br /&gt;
В языках, использующих [[вызов по значению]], тип-произведение может интерпретироваться как [[Произведение (теория категорий)|произведение в категории типов]]. В [[Соответствие Карри — Ховарда|соответствии Карри-Ховарда]] типы-произведения соответствуют [[конъюнкция|конъюнкции]] в логике (операции &amp;lt;code&amp;gt;AND&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Частный случай произведения двух типов часто называют «&amp;#039;&amp;#039;парой&amp;#039;&amp;#039;» или более точно «&amp;#039;&amp;#039;упорядоченной парой&amp;#039;&amp;#039;». Произведение произвольного конечного количества типов называется «&amp;#039;&amp;#039;[[арность|n-арным]] типом-произведением&amp;#039;&amp;#039;» или «&amp;#039;&amp;#039;кортежем из n типов&amp;#039;&amp;#039;». В русскоязычной литературе также присутствует вариант наименования «&amp;#039;&amp;#039;упорядоченная энка&amp;#039;&amp;#039;» (обобщение от «&amp;#039;&amp;#039;двойка&amp;#039;&amp;#039;», «&amp;#039;&amp;#039;тройка&amp;#039;&amp;#039;» и т. д.), лингвистически построенный по аналогии с английским термином «&amp;#039;&amp;#039;tuple&amp;#039;&amp;#039;» (см. [[:en:Tuple (computer science)|кортеж {{ref-en}}]]).&lt;br /&gt;
&lt;br /&gt;
Вырожденная форма типа-произведения — произведение нуля типов — представляет собой {{iw|единичный тип||en|unit type}} ({{lang-en|unit type}}, «&amp;#039;&amp;#039;тип юнит&amp;#039;&amp;#039;»), то есть тип, представленный единственным значением. [[Система типов|Системы типов]] некоторых языков (например, [[Python]]) могут предусматривать один или несколько уникальных единичных типов, не совместимых с &amp;#039;&amp;#039;типом кортежа из нуля элементов&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Типы-произведения встроены в большинство [[функциональное программирование|функциональных]] языков программирования. Например, произведение &amp;#039;&amp;#039;type&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;&amp;#039;&amp;#039;× … × &amp;#039;&amp;#039;type&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;&amp;#039;&amp;#039; записывается как &amp;#039;&amp;#039;type&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;&amp;#039;&amp;#039;&amp;lt;code&amp;gt; * &amp;lt;/code&amp;gt;…&amp;lt;code&amp;gt; * &amp;lt;/code&amp;gt;&amp;#039;&amp;#039;type&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;&amp;#039;&amp;#039; в [[ML]] или как &amp;lt;code&amp;gt;(&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;type&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt;…&amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;type&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;)&amp;lt;/code&amp;gt; в [[Haskell]]. В обоих языках [[Кортеж (информатика)|кортежи]] записываются как &amp;lt;code&amp;gt;(&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;v&amp;lt;sub&amp;gt;1&amp;lt;/sub&amp;gt;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt;…&amp;lt;code&amp;gt;,&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;v&amp;lt;sub&amp;gt;n&amp;lt;/sub&amp;gt;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;)&amp;lt;/code&amp;gt; и их компоненты извлекаются посредством [[сопоставление с образцом|сопоставления с образцом]]. В дополнение к этому большинство функциональных языков предоставляет [[Алгебраический тип данных|алгебраические типы данных]], расширяющие понятия как типа-произведения, так и [[тип-сумма|типа-суммы]]. Алгебраические типы, заданные единственным [[Конструктор (функциональное программирование)|конструктором]], [[изоморфизм|изоморфны]] типам-произведениям.&lt;br /&gt;
&lt;br /&gt;
Кортеж типов как чистое воплощение типа-произведения служит формальным обоснованием для более часто встречающегося в языках составного типа «[[Запись (тип данных)|запись]]»{{переход|#Запись}}, хотя в некоторых языках реализованы оба контейнера. Разница обычно заключается в том, что кортежи задают и сохраняют порядок следования своих компонентов в памяти ЭВМ (это важно при обращении к их компонентам посредством [[Указатель (тип данных)#адресная арифметика|адресной арифметики]]), но не предоставляют возможности доступа к ним посредством квалифицированных идентификаторов, а записи, наоборот, определяют идентификаторы, но не определяют порядок следования. Однако, есть исключения:&lt;br /&gt;
* в языке [[Standard ML]] кортежи значений с целью оптимизации размещения в памяти реализуются посредством записей, у которых в качестве идентификаторов компонентов используются их порядковые номера в кортеже; адресная арифметика недоступна; типы перестают существовать после компиляции; и требуемый порядок следования принуждается только при {{iw|Внешнеязыковой интерфейс|межъязыковом взаимодействии|en|Foreign Function Interface}}.&lt;br /&gt;
* в языке [[Си (язык программирования)|Си]] тип данных «&amp;#039;&amp;#039;[[Структура (программирование)|структура]]&amp;#039;&amp;#039;» (&amp;lt;code&amp;gt;struct&amp;lt;/code&amp;gt;){{переход|#Структура (Си)}} соединяет в себе свойства записей и кортежей, то есть позволяет назначать компонентам идентификаторы и одновременно гарантирует сохранение порядка их следования. Кроме того, в отличие от записей и кортежей, структуры в Си могут содержать [[Указатель (программирование)|указатели]] на собственные объекты, что позволяет непосредственно строить {{iw|рекурсивный тип данных|рекурсивные типы данных|en|Recursive data type}}.&lt;br /&gt;
&lt;br /&gt;
== Реализация в языках программирования ==&lt;br /&gt;
&lt;br /&gt;
=== {{якорь|tuple type|Кортеж}} Кортежи ===&lt;br /&gt;
{{main|Кортеж (информатика)}}&lt;br /&gt;
&lt;br /&gt;
=== {{якорь|record type|Запись}} Записи ===&lt;br /&gt;
{{main|Запись (тип данных)}}&lt;br /&gt;
Во многих языках запись представляет собой [[агрегирование (программирование)|агрегатный тип данных]], [[инкапсуляция (программирование)|инкапсулирующий]] без [[Сокрытие (программирование)|сокрытия]] набор [[Значение_(информатика)|значений]] различных типов.&lt;br /&gt;
&lt;br /&gt;
В одних языках (например, в [[Си (язык программирования)|Си]] или [[Паскаль (язык программирования)|Паскале]]) порядок размещения значений в памяти задаётся при определении типа и сохраняется на протяжении времени жизни объектов, что даёт возможность косвенного доступа (например, через [[Указатель (тип данных)|указатели]]); в других языках (например, в [[ML]]) порядок размещения не определён, так что доступ к значениям возможен только по квалифицированному идентификатору. В некоторых языках, хотя порядок следования и сохраняется, но [[Выравнивание данных|выравнивание]] контролируется компилятором, так что использование адресной арифметики может оказаться платформенно-зависимым. Некоторые языки позволяют присваивание между экземплярами разных записей, игнорируя различия в идентификаторах компонентов записей, и основываясь только на порядке следования. Другие языки, напротив, учитывают только совпадение имён, разрешая различия в порядке их определения.&lt;br /&gt;
&lt;br /&gt;
Впервые записи были представлены в языке [[Кобол]], где они имели довольно сложную нотацию. При проверке согласования типов, Кобол учитывает только совпадение имён полей записей и не учитывает совпадение порядка их следования.&lt;br /&gt;
&lt;br /&gt;
[[Кортеж (информатика)|Кортежи]] служат формальным обоснованием записей в [[теория типов|теории типов]]. В то же время, в языках кортежи временами могут реализовываться посредством записей, использующих в качестве идентификаторов индексные номера полей в получаемом кортеже.&lt;br /&gt;
&lt;br /&gt;
=== {{якорь|struct type|Структура|Структура (Си)}} Структуры в Си ===&lt;br /&gt;
{{main|Структура (язык Си)}}&lt;br /&gt;
В языке [[Си (язык программирования)|Си]], &amp;#039;&amp;#039;&amp;#039;структура&amp;#039;&amp;#039;&amp;#039; (&amp;lt;code&amp;gt;struct&amp;lt;/code&amp;gt;) — [[агрегирование (программирование)|композитный тип данных]], [[инкапсуляция (программирование)|инкапсулирующий]] без [[Сокрытие (программирование)|сокрытия]] набор [[Значение_(информатика)|значений]] различных типов. Порядок размещения значений в памяти задаётся при определении типа и сохраняется на протяжении времени жизни объектов, что даёт возможность косвенного доступа (например, через [[Указатель (тип данных)|указатели]]).&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
{{примечания}}&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
* {{статья&lt;br /&gt;
| автор =&lt;br /&gt;
| заглавие = Homotopy Type Theory: Univalent Foundations of Mathematics, section 1.5&lt;br /&gt;
| язык = en&lt;br /&gt;
| издательство = The Univalent Foundations Program, Institute for Advanced Study&lt;br /&gt;
| ссылка = http://homotopytypetheory.org/2013/06/20/the-hott-book/&lt;br /&gt;
| ref =&lt;br /&gt;
}}&lt;br /&gt;
* {{книга&lt;br /&gt;
| автор = [[Харпер, Роберт|Роберт Харпер]]&lt;br /&gt;
| заглавие = Введение в Стандартный ML&lt;br /&gt;
| издательство = Carnegie Mellon University&lt;br /&gt;
| год = 1986&lt;br /&gt;
| страниц = 97&lt;br /&gt;
| isbn = PA 15213-3891&lt;br /&gt;
| ссылка =&lt;br /&gt;
| ref = Harper&lt;br /&gt;
}}&lt;br /&gt;
* {{книга&lt;br /&gt;
| автор = Эммануэль Шалуа, Паскаль Манури, Бруно Пагано&lt;br /&gt;
| заглавие = Разработка программ с помощью Objective Caml&lt;br /&gt;
| издательство =&lt;br /&gt;
| год = 2007&lt;br /&gt;
| страниц =&lt;br /&gt;
| isbn =&lt;br /&gt;
| ссылка =&lt;br /&gt;
| ref = Шалуа-Манури-Пагано&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{типы данных}}&lt;br /&gt;
&lt;br /&gt;
[[Категория:Типы данных]]&lt;br /&gt;
[[Категория:Теория типов]]&lt;br /&gt;
[[Категория:Структуры данных]]&lt;br /&gt;
[[Категория:Инкапсуляция (программирование)]]&lt;br /&gt;
[[Категория:Типы данных СУБД]]&lt;br /&gt;
[[Категория:Составные типы данных]]&lt;/div&gt;</summary>
		<author><name>ru_wikipedia&gt;WinterheartBot</name></author>
	</entry>
</feed>