<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>http://digida.mgpu.ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=188.232.0.0%2F16</id>
	<title>Поле цифровой дидактики - Вклад [ru]</title>
	<link rel="self" type="application/atom+xml" href="http://digida.mgpu.ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=188.232.0.0%2F16"/>
	<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/188.232.0.0/16"/>
	<updated>2026-10-19T20:37:11Z</updated>
	<subtitle>Вклад</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>http://digida.mgpu.ru/index.php?title=%D0%9A%D0%BE%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D0%BE%D1%80_(%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5)&amp;diff=4552</id>
		<title>Конструктор (функциональное программирование)</title>
		<link rel="alternate" type="text/html" href="http://digida.mgpu.ru/index.php?title=%D0%9A%D0%BE%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D0%BE%D1%80_(%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B0%D0%BB%D1%8C%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5)&amp;diff=4552"/>
		<updated>2020-12-24T10:18:27Z</updated>

		<summary type="html">&lt;p&gt;188.232.183.106: Просто опечатка, видимо.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{не путать|Конструктор типов}}&lt;br /&gt;
В [[теория типов|теории типов]] и [[функциональное программирование|функциональных языках программирования]] &#039;&#039;&#039;конструктор алгебраического типа данных&#039;&#039;&#039; или просто &#039;&#039;&#039;конструктор&#039;&#039;&#039; представляет собой функцию с пустым телом, конструирующую объект &#039;&#039;&#039;[[Алгебраический тип данных|алгебраического типа данных]]&#039;&#039;&#039;. Оптимизирующие компиляторы исполняют эти функции статически, то есть {{iw|Стадия компиляции (программирование)|на этапе компиляции|en|compile time}}.&lt;br /&gt;
&lt;br /&gt;
Алгебраические типы данных являются важным элементом языков, [[Система типов Хиндли — Милнера|типизированных по Хиндли — Милнеру]].&lt;br /&gt;
&lt;br /&gt;
== Пример ==&lt;br /&gt;
Простейшую структуру [[XML]]-документа в [[Standard ML]] можно определить следующим образом&amp;lt;!-- Пример взят из {{sfn|Pucella, Notes on Programming SML/NJ|2001|loc=5.3 Prettyprinting|с=136}}, с двумя изменениями: дополнен нуль-арным конструктором для более полного изложения; тип запись заменен на кортеж для упрощения кодов --&amp;gt;:&lt;br /&gt;
&amp;lt;source lang=ocaml&amp;gt;&lt;br /&gt;
datatype simple_xml = Empty&lt;br /&gt;
                    | Word of string&lt;br /&gt;
                    | Tagged of string * simple_xml list&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Это определение [[алгебраический тип данных|алгебраического типа данных]]. Оно вводит в программу четыре идентификатора: нуль-арный [[конструктор типов]] &amp;lt;code&amp;gt;simple_xml&amp;lt;/code&amp;gt; и три &#039;&#039;&#039;конструктора&#039;&#039;&#039; [[Объект (программирование)|объектов]] этого алгебраического типа: [[арность|нуль-арный]] &amp;lt;code&amp;gt;Empty&amp;lt;/code&amp;gt;, унарный &amp;lt;code&amp;gt;Word&amp;lt;/code&amp;gt; и бинарный &amp;lt;code&amp;gt;Tagged&amp;lt;/code&amp;gt;. Последний принимает два параметра (в данном случае в виде [[кортеж (информатика)|кортежа]]), второй из которых имеет тип &amp;lt;code&amp;gt;simple_xml list&amp;lt;/code&amp;gt; (то есть [[Список (информатика)|список]] объектов определяемого здесь типа). Таким образом, &amp;lt;code&amp;gt;simple_xml&amp;lt;/code&amp;gt; представляет собой {{iw|рекурсивный тип данных||en|Recursive data type}}.&lt;br /&gt;
&lt;br /&gt;
Конструкторы обладают всеми правами функций (например, конструктор &amp;lt;code&amp;gt;Word&amp;lt;/code&amp;gt; имеет [[функциональный тип]] «&amp;lt;code&amp;gt;string -&amp;gt; simple_xml&amp;lt;/code&amp;gt;»), и в частности, могут использоваться в [[абстракция функций|абстракции функций]].&lt;br /&gt;
&amp;lt;source lang=ocaml&amp;gt;&lt;br /&gt;
fun listOfWords s =&lt;br /&gt;
   map Word (String.tokens Char.isSpace s)&lt;br /&gt;
&lt;br /&gt;
fun toString e =&lt;br /&gt;
   let val scat = String.concat in&lt;br /&gt;
      case e of&lt;br /&gt;
         Empty =&amp;gt; &amp;quot;&amp;quot;&lt;br /&gt;
       | Word s =&amp;gt; s ^ &amp;quot; &amp;quot;&lt;br /&gt;
       | Tagged (tag, contents) =&amp;gt; scat [ &amp;quot;&amp;lt;&amp;quot;,tag,&amp;quot;&amp;gt;&amp;quot;, scat (map toString contents), &amp;quot;&amp;lt;/&amp;quot;,tag,&amp;quot;&amp;gt;&amp;quot; ]&lt;br /&gt;
   end&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
В теле функции &amp;lt;code&amp;gt;listOfWords&amp;lt;/code&amp;gt; можно видеть как конструктор &amp;lt;code&amp;gt;Word&amp;lt;/code&amp;gt; передаётся в качестве параметра функции [[map (программирование)|&amp;lt;code&amp;gt;map&amp;lt;/code&amp;gt;]], и та применяет его к каждому элементу списка строк, который она получает вторым параметром. Список строк, в свою очередь, получен токенизацией (в данном случае просто разбиением на слова) строки, которую получила функция &amp;lt;code&amp;gt;listOfWords&amp;lt;/code&amp;gt; входным параметром.&lt;br /&gt;
&lt;br /&gt;
Каждое применение конструктора &amp;lt;code&amp;gt;Word&amp;lt;/code&amp;gt; к объекту типа «строка» порождает объект типа &amp;lt;code&amp;gt;simple_xml&amp;lt;/code&amp;gt;. Эти порождённые объекты затем используются для построения [[Список (информатика)|списка]] (это происходит внутри функции &amp;lt;code&amp;gt;map&amp;lt;/code&amp;gt;) — таким образом, результатом функции &amp;lt;code&amp;gt;listOfWords&amp;lt;/code&amp;gt; будет список объектов типа &amp;lt;code&amp;gt;simple_xml&amp;lt;/code&amp;gt;. Это подтверждается её [[Функциональный тип|функциональным типом]], который [[вывод типов|выводит]] компилятор: «&amp;lt;code&amp;gt;string -&amp;gt; simple_xml list&amp;lt;/code&amp;gt;». Соответственно, результат функции может непосредственно использоваться в качестве параметра для другого конструктора данного типа — &amp;lt;code&amp;gt;Tagged&amp;lt;/code&amp;gt; — что породит новый объект типа &amp;lt;code&amp;gt;simple_xml&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;source lang=ocaml&amp;gt;&lt;br /&gt;
fun mkXmlFile s = Tagged ( &amp;quot;main&amp;quot;, listOfWords s )&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Таким образом, [[XML]]-документ строится посредством рекурсивной композиции конструкторов [[алгебраический тип данных|алгебраического типа]] (отсюда и название «&#039;&#039;рекурсивный тип данных&#039;&#039;»). Например, такой документ&lt;br /&gt;
&amp;lt;source lang=xml&amp;gt;&lt;br /&gt;
&amp;lt;main&amp;gt;Here is some text&amp;lt;/main&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
будет представлен в программе такой [[Структура данных|структурой данных]]:&lt;br /&gt;
&amp;lt;source lang=ocaml&amp;gt;&lt;br /&gt;
Tagged ( &amp;quot;main&amp;quot;, [Word &amp;quot;Here&amp;quot;, Word &amp;quot;is&amp;quot;, Word &amp;quot;some&amp;quot;, Word &amp;quot;text&amp;quot;] )&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
В этой записи перемешивается использование конструкторов двух типов — &amp;lt;code&amp;gt;simple_xml&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;list&amp;lt;/code&amp;gt;. Синтаксис «&amp;lt;code&amp;gt;[ , , ]&amp;lt;/code&amp;gt;», конструирующий список, является на самом деле [[синтаксический сахар|синтаксическим сахаром]] над цепочкой конструкторов типа &amp;lt;code&amp;gt;list&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;source lang=ocaml&amp;gt;&lt;br /&gt;
Tagged ( &amp;quot;main&amp;quot;, Word &amp;quot;Here&amp;quot; :: Word &amp;quot;is&amp;quot; :: Word &amp;quot;some&amp;quot; :: Word &amp;quot;text&amp;quot; :: nil )&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Хотя тип &amp;lt;code&amp;gt;list&amp;lt;/code&amp;gt; и встроен во все [[Система типов Хиндли — Милнера|Х-М-типизированные]] языки, но формально он определяется как {{iw|рекурсивный тип данных||en|Recursive data type}} с нуль-арным конструктором &amp;lt;code&amp;gt;nil&amp;lt;/code&amp;gt; и бинарным конструктором &amp;lt;code&amp;gt;cons&amp;lt;/code&amp;gt;, который обычно имеет инфиксное символьное имя (два двоеточия в классических диалектах [[ML]] или одно в [[Haskell|Хаскеле]]):&lt;br /&gt;
&amp;lt;source lang=ocaml&amp;gt;&lt;br /&gt;
datatype &#039;a list = nil | :: of &#039;a * &#039;a list&lt;br /&gt;
infixr 5 ::&lt;br /&gt;
&amp;lt;/source&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;
* {{статья&lt;br /&gt;
 |автор         = Riccardo Pucella&lt;br /&gt;
 |заглавие      = Notes on Programming Standard ML of New Jersey&lt;br /&gt;
 |ссылка        =&lt;br /&gt;
 |язык          ={{ref-en}}&lt;br /&gt;
 |издание       = Last revised January 10, 2001&lt;br /&gt;
 |издательство  = Cornell University&lt;br /&gt;
 |год           = 2001&lt;br /&gt;
 |isbn          =&lt;br /&gt;
 |ref           = Pucella, Notes on Programming SML/NJ&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;
[[Категория:Языки программирования семейства ML]]&lt;/div&gt;</summary>
		<author><name>188.232.183.106</name></author>
	</entry>
</feed>