Konstruktör (funktionell programmering)

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 .

Exempel

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 lista

Detta ä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 , ">" ] slut

I 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 ::

Se även

Litteratur

  • Riccardo Pucella. Notes on Programming Standard ML of New Jersey (  ( Engelska) ) // Senast reviderad 10 januari 2001. - Cornell University, 2001.