Конструктор типов: различия между версиями
[отпатрулированная версия] | [отпатрулированная версия] |
Содержимое удалено Содержимое добавлено
м →Пример: стилевые правки |
доделка |
||
Строка 1:
== Пример ==
Конструкторы типов являются важным элементов языков, [[Система типов Хиндли — Милнера|типизированных по Хиндли
Например, простейшую структуру [[XML]]-документа можно определить следующим образом:
Строка 9:
datatype simple_xml = Empty
| Word of string
| Tagged of
</source>
Это определение вводит в программу четыре идентификатора: [[алгебраический тип данных]] <code>simple_xml</code> и три его конструктора: [[арность|нуль-арный]] <code>Empty</code>,
Конструкторы типов обладают всеми правами функций (например, конструктор <code>Word</code> имеет {{iw|функциональный тип||en|Function type}}
<source lang=ocaml>
fun listOfWords s =
Строка 23:
Empty => ""
| Word s => s ^ " "
| Tagged
end
</source>
В теле функции <code>listOfWords</code> можно видеть как конструктор типа <code>Word</code> передаётся в качестве параметра функции [[map|<code>map</code>]], и та применяет его к каждому элементу списка строк, который она получает вторым параметром.
<source lang=ocaml>
fun mkXmlFile s = Tagged
</source>
Таким образом, [[XML]]-документ строится посредством рекурсивной композиции конструкторов типа. Например, документ
<source lang=xml>
<main>Jackdaws love my big sphinx of quartz</main>
</source>
будет представлен в программе такой [[Структура данных|структурой данных]]:
<source lang=ocaml>
Tagged ( "main", [Word "Jackdaws", Word "love", Word "my", Word "big", Word "sphinx", Word "of", Word "quartz"] )
</source>
== Теория ==
По сути, конструктор типа представляет собой [[арность|''<code>n</code>''-арный]] '''ти́повый оператор''' ({{lang-en|type operator}}, оператор над типами), принимающий на входе ноль или более типов, и возвращающий другой тип. При использовании [[каррирование|каррирования]] ''<code>n</code>''-арный ти́повый оператор может быть представлен последовательным применением унарных ти́повых операторов. Следовательно, ти́повые операторы можно рассматривать как [[просто типизированное лямбда-исчисление]], имеющее единственный тип, обычно обозначаемый * (читается «''тип''»), являющийся типом всех типов в нижележащем языке, которые в этом случае можно называть ''характерными типами'', чтобы отличать их от типов ти́повых операторов в их собственном исчислении — {{iw|Род (теория типов)|'''родов типов'''|en|Kind (type theory)}}.
Однако, использование ти́повых операторов в качестве обоснования просто типизированного лямбда-исчисления — это больше, чем просто формализация — это делает возможными ти́повые операторы высших порядков (см. {{iw|Род (теория типов)#Примеры|примеры родов типов'''|en|Kind (type theory)#Examples}}). Ти́повые операторы соотносятся со второй осью в [[Лямбда-куб|лямбда-кубе]], приводя к просто типизированному лямбда-исчислению с ти́повыми операторами — λ<sub>ω</sub>. Комбинация ти́повых операторов с полиморфным лябда-исчислением ({{nowrap|[[Система F|системой F]]}}) порождает {{iw|Система F-омега|{{nowrap|систему Fω}}|en|System F-omega}}.
== См.
* [[Алгебраический тип данных]]
* {{iw|Рекурсивный тип данных||en|Recursive data type}}
* {{iw|Род (теория типов)||en|Kind (type theory)}}
<!--
== Примечания ==
{{примечания}}
-->
== Ссылки ==
* {{статья
|автор = Benjamin Pierce
|заглавие = Types and Programming Languages
|издательство = MIT Press
|год = 2002
|ISBN = 0-262-16209-1
|ссылка =
|ref =
}}, глава 29, "Type Operators and Kinding"
* {{статья
|автор = {{iw|P.T. Johnstone}}
|заглавие = Sketches of an Elephant
|издательство =
|страницы = 940
|год =
|ссылка =
|ref =
}}
{{Типы данных}}
[[Категория:Информатика]]
[[Категория:Формальные методы]]
Строка 63 ⟶ 83 :
[[Категория:Типы данных]]
[[Категория:Определение соответствия]]
{{compu-prog-stub}}
|