I typeteori og funktionelle programmeringssprog er en algebraisk datatypekonstruktør, eller blot en konstruktør , en funktion med en tom krop, der konstruerer et algebraisk datatypeobjekt . Optimering af compilere udfører disse funktioner statisk, det vil sige på kompileringstidspunktet .
Algebraiske datatyper er et vigtigt element i Hindley-Milner-typesprog .
Den enkleste struktur af et XML- dokument i Standard ML kan defineres som følger:
datatype simple_xml = Tom | ord af streng | Tagget af streng * simple_xml listeDette er definitionen af en algebraisk datatype . Det introducerer fire identifikatorer i programmet: en nullær type konstruktør ogsimple_xml tre objektkonstruktører af denne algebraiske type: nullær , unær og binær . Sidstnævnte tager to parametre (i dette tilfælde som en tuple ), hvoraf den anden har en type (det vil sige en liste over objekter af den type, der er defineret her). Er således en rekursiv datatype . EmptyWordTaggedsimple_xml listsimple_xml
Konstruktører har alle rettighederne til funktioner (for eksempel har en konstruktør Worden funktionstype " string -> simple_xml"), og kan især bruges i funktionsabstraktion .
sjov listeOfWords s = map Word ( String . tokens Char . isSpace s ) fun toString e = let val scat = String . concat i tilfælde e af Tom => "" | Ord s => s ^ " " | Tagget ( tag , indhold ) => scat [ "<" , tag , ">" , scat ( map toString contents ), "</" , tag , ">" ] endI funktionens brødtekst listOfWordskan du se, hvordan konstruktøren Wordoverføres som en parameter til funktionen map, og den anvender den på hvert element i listen over strenge, som den modtager som den anden parameter. Listen over strenge opnås igen ved at tokenisere (i dette tilfælde blot at bryde op i ord) den streng, som funktionen modtog som en listOfWordsinputparameter.
Hver anvendelse af en konstruktør Wordtil et objekt af typen "streng" producerer et objekt af typen simple_xml. Disse underordnede objekter bruges derefter til at bygge en liste (dette sker inde i map) - så resultatet af funktionen listOfWordsvil være en liste over objekter af typen simple_xml. Dette bekræftes af dens funktionstype , som udledes af compileren: " string -> simple_xml list". Følgelig kan resultatet af funktionen bruges direkte som en parameter for en anden konstruktør af denne type - Tagged - som vil skabe et nyt objekt af typen simple_xml:
sjov mkXmlFile s = Tagget ( "main" , listOfWords s )Et XML - dokument er således konstrueret ved rekursivt at komponere algebraiske typekonstruktører (deraf navnet " rekursiv datatype "). For eksempel et sådant dokument
<main> Her er noget tekst </main>vil blive repræsenteret i programmet af følgende datastruktur :
Tagget ( "hoved" , [ Ord "Her" , Ord "er" , Ord "nogle" , Ord "tekst" ] )Denne post blander brugen af to typer konstruktører - simple_xmlog list. Syntaksen [ , , ], der konstruerer en liste , er faktisk syntaktisk sukker over en kæde af typekonstruktører list:
Tagget ( "main" , Word "Here" :: Word "er" :: Word "nogle" :: Word "tekst" :: nul )Selvom type lister indbygget i alle XM-typede sprog, er den formelt defineret som en rekursiv datatype en nulkonstruktør nilog en binær konstruktør cons, der normalt har et infix symbolsk navn (to koloner i klassiske ML -dialekter eller et i Haskell). ):
datatype ' en liste = nul | :: af ' a * ' en liste infixr 5 ::Datatyper | |
---|---|
Ufortolkelig | |
Numerisk | |
Tekst | |
Reference | |
Sammensatte | |
abstrakt | |
Andet | |
relaterede emner |