I typteori och funktionella programmeringsspråk är en algebraisk datatypkonstruktor, eller helt enkelt en konstruktor , en funktion med en tom kropp som konstruerar ett algebraiskt datatypobjekt . Optimerande kompilatorer exekverar dessa funktioner statiskt, det vill säga vid kompileringstid .
Algebraiska datatyper är en viktig del av Hindley-Milner-skrivna språk .
Den enklaste strukturen för ett XML- dokument i Standard ML kan definieras enligt följande:
datatyp simple_xml = Tom | ord av sträng | Taggad av sträng * simple_xml listaDetta är definitionen av en algebraisk datatyp . Den introducerar fyra identifierare i programmet: en nullär typkonstruktor simple_xml och tre objektkonstruktorer av denna algebraiska typ: nullär Empty , unär Wordoch binär Tagged. Den senare tar två parametrar (i det här fallet som en tupel ), av vilka den andra har en typ simple_xml list(det vill säga en lista över objekt av den typ som definieras här). Det är alltså simple_xmlen rekursiv datatyp .
Konstruktörer har alla rättigheter för funktioner (till exempel en konstruktor Wordhar en funktionstyp " string -> simple_xml"), och kan i synnerhet användas i funktionsabstraktion .
fun listOfWords s = kartord ( String . tokens Char . isSpace s ) _ fun toString e = let val scat = String . concat i fallet e av Tom => "" | Ord s => s ^ " " | Taggad ( tagg , innehåll ) => scat [ "<" , tagg , ">" , scat ( mappa till String- innehåll ), "</" , tagg , ">" ] slutI funktionens listOfWordsbrödtext kan du se hur konstruktorn Wordskickas som en parameter till funktionen mapoch den tillämpar den på varje element i listan med strängar som den tar emot som den andra parametern. Listan över strängar erhålls i sin tur genom att tokenisera (i detta fall helt enkelt bryta upp i ord) strängen som funktionen fick som en listOfWordsindataparameter.
Varje tillämpning av en konstruktor Wordpå ett objekt av typen "sträng" producerar ett objekt av typen simple_xml. Dessa underordnade objekt används sedan för att bygga en lista (detta händer inuti map) - så resultatet av funktionen listOfWordsblir en lista med objekt av typen simple_xml. Detta bekräftas av dess funktionstyp , vilket härleds av kompilatorn: " string -> simple_xml list". Följaktligen kan resultatet av funktionen användas direkt som en parameter för en annan konstruktör av denna typ - Tagged - vilket kommer att skapa ett nytt objekt av typen simple_xml:
fun mkXmlFile s = Taggad ( "main" , listOfWords s )Således konstrueras ett XML- dokument genom att rekursivt komponera algebraiska typkonstruktörer (därav namnet " rekursiv datatyp "). Till exempel ett sådant dokument
<main> Här är lite text </main>kommer att representeras i programmet av följande datastruktur :
Taggad ( "huvud" , [ Ord "Här" , Ord "är" , Ord "några" , Ord "text" ] )Denna post blandar användningen av två typer av konstruktörer - simple_xmloch list. Syntaxen [ , , ]som konstruerar en lista är faktiskt syntaktisk socker över en kedja av typkonstruktörer list:
Taggad ( "main" , Word "Here" :: Word "is" :: Word "some" :: Word "text" :: noll )Även om typ listär inbyggd i alla XM-typade språk, definieras den formellt som en rekursiv datatyp en nollkonstruktor niloch en binär konstruktor conssom vanligtvis har ett symboliskt infixnamn (två kolon i klassiska ML- dialekter eller ett i Haskell). ):
datatyp ' en lista = noll | :: av ' a * ' en lista infixr 5 ::Datatyper | |
---|---|
Otolkbart | |
Numerisk | |
Text | |
Referens | |
Sammansatt | |
abstrakt | |
Övrig | |
Relaterade ämnen |