V teorii typů a funkcionálních programovacích jazycích je konstruktor algebraického datového typu nebo jednoduše konstruktor funkcí s prázdným tělem, která vytváří objekt algebraického datového typu . Optimalizační kompilátory provádějí tyto funkce staticky, to znamená v době kompilace .
Algebraické datové typy jsou důležitým prvkem Hindley-Milner typizovaných jazyků .
Nejjednodušší strukturu dokumentu XML ve standardním ML lze definovat takto:
datový typ simple_xml = Prázdné | slovo řetězce | _ Tagged of string * simple_xml listToto je definice algebraického datového typu . Do programu zavádí čtyři identifikátory: konstruktor typu simple_xml nullary a tři konstruktory objektů tohoto algebraického typu: nulary Empty , unary Worda binary Tagged. Ten má dva parametry (v tomto případě jako n-tice ), z nichž druhý má typ simple_xml list(tj. seznam objektů zde definovaného typu). Jedná se tedy simple_xmlo rekurzivní datový typ .
Konstruktory mají všechna práva funkcí (například konstruktor Wordmá typ funkce " string -> simple_xml"), a zejména je lze použít při abstrakci funkcí .
fun listOfWords s = mapa Word ( Řetězec . tokenů Char . isSpace s ) fun toString e = nech val scat = String . concat v případě e prázdné => " " | Slovo s => s ^ " " | Tagged ( tag , content ) => scat [ " < " , tag , ">" , scat ( map toString content ), "</" , tag , ">" ] endV těle funkce listOfWordsmůžete vidět, jak je konstruktor Wordpředán jako parametr funkci mapa ta jej aplikuje na každý prvek seznamu řetězců, který obdrží jako druhý parametr. Seznam řetězců se zase získá tokenizací (v tomto případě pouhým rozdělením na slova) řetězce, který funkce obdržela jako listOfWordsvstupní parametr.
Každá aplikace konstruktoru Wordna objekt typu "string" vytvoří objekt typu simple_xml. Tyto podřízené objekty jsou pak použity k vytvoření seznamu (to se děje uvnitř map) - takže výsledkem funkce listOfWordsbude seznam objektů typu simple_xml. To je potvrzeno jeho typem funkce , který je odvozen kompilátorem: " string -> simple_xml list". V souladu s tím lze výsledek funkce přímo použít jako parametr pro jiný konstruktor tohoto typu - Tagged - který vytvoří nový objekt typu simple_xml:
fun mkXmlFile s = Tagged ( "main" , listOfWords s )Dokument XML je tedy konstruován pomocí rekurzivního skládání konstruktorů algebraického typu (odtud název " rekurzivní datový typ "). Například takový dokument
<main> Zde je nějaký text </main>bude v programu reprezentována následující datovou strukturou :
Tagged ( "hlavní" , [ slovo "zde" , slovo "je" , slovo "nějaký" , slovo "text" ] )Tento záznam kombinuje použití dvou typů konstruktorů - simple_xmla list. Syntaxe [ , , ], která vytváří seznam " " je ve skutečnosti syntaktický cukr v řetězci typových konstruktorů list:
Tagged ( "hlavní" , Slovo "Tady" :: Slovo "je" :: Slovo "nějaký" :: Slovo "text" :: nula )Ačkoli listje typ zabudován do všech jazyků typu XM , je formálně definován jako rekurzivní datový typ nulovým konstruktorem nila binárním konstruktorem cons, který má obvykle infixové symbolické jméno (dvě dvojtečky v klasických dialektech ML nebo jedna v Haskell). ):
datový typ ' a list = nula | :: z ' a * ' seznam infixr 5 :: _Typy dat | |
---|---|
Neinterpretovatelné | |
Numerický | |
Text | |
Odkaz | |
Kompozitní | |
abstraktní | |
jiný | |
související témata |