Конструктор (функциональное программирование): различия между версиями

Материал из Поле цифровой дидактики
 
(не показана 1 промежуточная версия этого же участника)
Строка 1: Строка 1:
В [[теория типов|теории типов]] и [[функциональное программирование|функциональных языках программирования]] '''конструктор алгебраического типа данных''' или просто '''конструктор''' представляет собой функцию с пустым телом, конструирующую объект '''[[Алгебраический тип данных|алгебраического типа данных]]'''.  
В [[теория типов|теории типов]] и [[функциональное программирование|функциональных языках программирования]] '''конструктор алгебраического типа данных''' или просто '''конструктор''' представляет собой функцию с пустым телом, конструирующую объект '''[[Алгебраический тип данных|алгебраического типа данных]]'''.  


Алгебраические типы данных являются важным элементом языков, [[Система типов Хиндли — Милнера|типизированных по Хиндли — Милнеру]].
Алгебраические типы данных являются важным элементом языков.


== Пример ==
== Пример ==
Простейшую структуру [[XML]]-документа в [[Standard ML]] можно определить следующим образом<
Простейшую структуру [[XML]]-документа в [[Standard ML]] можно определить следующим образом<
 
<syntaxhighlight lang="ocaml" line>
<source lang=ocaml>
datatype simple_xml = Empty
datatype simple_xml = Empty
                     | Word of string
                     | Word of string
                     | Tagged of string * simple_xml list
                     | Tagged of string * simple_xml list
</source>
</syntaxhighlight>
Это определение [[алгебраический тип данных|алгебраического типа данных]]. Оно вводит в программу четыре идентификатора: нуль-арный [[конструктор типов]] <code>simple_xml</code> и три '''конструктора''' [[Объект (программирование)|объектов]] этого алгебраического типа: [[арность|нуль-арный]] <code>Empty</code>, унарный <code>Word</code> и бинарный <code>Tagged</code>. Последний принимает два параметра (в данном случае в виде [[кортеж (информатика)|кортежа]]), второй из которых имеет тип <code>simple_xml list</code> (то есть [[Список (информатика)|список]] объектов определяемого здесь типа). Таким образом, <code>simple_xml</code> представляет собой {{iw|рекурсивный тип данных||en|Recursive data type}}.
 
 


Конструкторы обладают всеми правами функций (например, конструктор <code>Word</code> имеет [[функциональный тип]] «<code>string -> simple_xml</code>»), и в частности, могут использоваться в [[абстракция функций|абстракции функций]].
Конструкторы обладают всеми правами функций.
<source lang=ocaml>
<syntaxhighlight lang="ocaml" line>
fun listOfWords s =
fun listOfWords s =
   map Word (String.tokens Char.isSpace s)
   map Word (String.tokens Char.isSpace s)
Строка 25: Строка 25:
       | Tagged (tag, contents) => scat [ "<",tag,">", scat (map toString contents), "</",tag,">" ]
       | Tagged (tag, contents) => scat [ "<",tag,">", scat (map toString contents), "</",tag,">" ]
   end
   end
</source>
</syntaxhighlight>


[[Категория:Структуры данных]]
[[Категория:Структуры данных]]

Текущая версия на 12:17, 19 октября 2022

В теории типов и функциональных языках программирования конструктор алгебраического типа данных или просто конструктор представляет собой функцию с пустым телом, конструирующую объект алгебраического типа данных.

Алгебраические типы данных являются важным элементом языков.

Пример

Простейшую структуру XML-документа в Standard ML можно определить следующим образом<

datatype simple_xml = Empty
                    | Word of string
                    | Tagged of string * simple_xml list


Конструкторы обладают всеми правами функций.

fun listOfWords s =
   map Word (String.tokens Char.isSpace s)

fun toString e =
   let val scat = String.concat in
      case e of
         Empty => ""
       | Word s => s ^ " "
       | Tagged (tag, contents) => scat [ "<",tag,">", scat (map toString contents), "</",tag,">" ]
   end