Конструктор типов: различия между версиями

[отпатрулированная версия][отпатрулированная версия]
Содержимое удалено Содержимое добавлено
шаблон не путать
Строка 9:
 
Конструкторы типов интенсивно используются в [[полнотиповое программирование|полнотиповом программировании]].
 
== В языках программирования ==
 
В [[язык программирования|языках программирования]] семейства [[ML]] конструктор типов представляется функцией над типами — т.е. функцией, которая получает на входе одни типы и возвращает другие типы. Оптимизирующие компиляторы исполняют эти функции статически, т.е. {{iw|Стадия компиляции (программирование)|на этапе компиляции|en|compile time}}.
 
В классических диалектах [[ML]] ([[Standard ML]], [[OCaml]]) для ''<code>n</code>''-арных конструкторов типов используется нотация [[Кортеж (информатика)|кортежей]]. В [[Haskell]] возможны [[каррирование|каррированные]] конструкторы типов. Классические диалекты [[ML]] при конструировании новых типов используют постфиксный синтаксис (например, «<code>int list</code>»), а [[Haskell]] — префиксный («<code>List Int</code>»).
 
=== Standard ML ===
 
В современных реализациях [[Standard ML]] примитивные типы, такие как <code>char</code>, <code>int</code>, <code>word</code>, <code>real</code>, определены в модулях стандартной библиотеки («''Basis''») как [[арность|нуль-арные]] конструкторы типов и экспортированы в общую [[область видимости]], т.е. ''на верхний уровень'' ({{lang-en|top-level}}) доступа компилятора. Такие классические [[агрегирование (программирование)|агрегатные типы]] как [[Массив (программирование)|массивы]] и [[Список (информатика)|списки]] реализованы аналогично, в виде [[арность|унарных]] конструкторов типов <code>vector</code> (массивы неизменяемых элементов), <code>array</code> (массивы изменяемых элементов) и <code>list</code>.
 
В [[Standard ML]] для определения конструкторов типов есть две разные конструкции — <code>type</code> и <code>datatype</code>. Первая определяет псевдоним имеющегося конструктора типов или их композиции, вторая вводит новый [[алгебраический тип данных]] со своими [[конструктор данных|конструкторами данных]]. Вновь определяемые конструкторы типов могут принимать любое количество аргументов.
<source lang=ocaml>
datatype t = T of int * real (* 0 аргументов *)
type 'a t = 'a * int (* 1 аргумент *)
datatype ('a, 'b) t = A | B of 'a * 'b (* 2 аргумента *)
type ('a, 'b, 'c) t = 'a * ('b -> 'c) (* 3 аргумента *)
</source>
 
Каждое применение конструктора типов порождает новый тип. Это значит, что если в одном модуле некий тип определяется как «<code>string list list</code>», и это определение затем тем или иным образом включается в два других модуля, то в каждом из этих модулей будет свой уникальный тип «<code>string list list</code>», и попытка совместного использования значений, принадлежащих к этим типам, приведёт к [[Система типов#Type checking|ошибке согласования типов]]. Если спецификация программы требует действительной ''идентичности'' этих типов в данном случае, то перед совместным их использованием необходимо явно указать об этом компилятору, используя в местах связывания этих модулей конструкции <code>sharing</code>, <code>where type</code> и <code>withtype</code>; в остальных модулях эти типы останутся уникальными (несовместимыми). Причина этого в том, что [[система типов]] в [[ML]] является [[Сильная и слабая типизация|сильной]], и это имеет более высокий приоритет, чем то, что она является {{iw|Структурная система типов|структурной|en|structural type system}}.
 
=== Haskell ===
 
<!-- Здесь лучше всего сосредоточиться на каррированных - кортежи рассмотрены в SML. Неплохо раскрыть прелести карринга на примере сложной иерархии типов. -->
{{sect-stub}}
 
== См.также ==