Rakentaja (toiminnallinen ohjelmointi)

Tyyppiteoriassa ja funktionaalisissa ohjelmointikielissä algebrallinen tietotyyppikonstruktori tai yksinkertaisesti konstruktori on funktio, jossa on tyhjä runko ja joka rakentaa algebrallisen tietotyypin objektin . Optimointikääntäjät suorittavat nämä toiminnot staattisesti eli käännöshetkellä .

Algebralliset tietotyypit ovat tärkeä osa Hindley-Milner- tyyppisiä kieliä .

Esimerkki

Standardi-ML :n XML - dokumentin yksinkertaisin rakenne voidaan määritellä seuraavasti:

tietotyyppi simple_xml = Tyhjä | merkkijonon sana | _ Merkitty merkkijonosta * simple_xml -lista _

Tämä on algebrallisen tietotyypin määritelmä . Se tuo ohjelmaan neljä tunnistetta: nollatyyppisen konstruktorin jasimple_xml kolme tämän algebratyypin objektikonstruktoria: nullary , unary ja binary . Jälkimmäinen ottaa kaksi parametria (tässä tapauksessa monikko ), joista toisella on tyyppi (eli luettelo tässä määritellyn tyyppisistä objekteista). On siis rekursiivinen tietotyyppi . EmptyWordTaggedsimple_xml listsimple_xml

Konstruktoreilla on kaikki funktioiden oikeudet (esimerkiksi konstruktorilla Wordon funktiotyyppi " string -> simple_xml"), ja erityisesti niitä voidaan käyttää funktion abstraktiossa .

hauska listaOfWords s = kartta Word ( String . tokens Char . isSpace s ) fun toString e = anna val scat = String . concat tapauksessa e Tyhjä = > " " | Sana s => s ^ " " | Tagged ( tag , contents ) => scat [ "<" , tag , ">" , scat ( map toString contents ), "</" , tag , ">" ] end

Funktion rungosta listOfWordsnäet kuinka konstruktori Wordvälitetään parametrina funktiolle mapja se soveltaa sitä jokaiseen merkkijonoluettelon elementtiin, jonka se vastaanottaa toisena parametrina. Merkkijonoluettelo puolestaan ​​saadaan tokenisoimalla (tässä tapauksessa yksinkertaisesti jakamalla sanoiksi) merkkijono, jonka funktio vastaanotti listOfWordssyöteparametrina.

Jokainen konstruktorin sovellus Word"merkkijono"-tyypin objektiin tuottaa objektin, jonka tyyppi on simple_xml. Näitä lapsiobjekteja käytetään sitten luettelon muodostamiseen (tämä tapahtuu :n sisällä map) - joten funktion tuloksena listOfWordson luettelo objekteista, joiden tyyppi on simple_xml. Tämän vahvistaa sen funktiotyyppi , jonka kääntäjä päätteleestring -> simple_xml list : " ". Vastaavasti funktion tulosta voidaan käyttää suoraan parametrina toiselle tämän tyyppiselle konstruktorille - Tagged - joka luo uuden tyypin objektin simple_xml:

fun mkXmlFile s = Tagged ( "main" , listOfWords s )

Siten XML - dokumentti muodostetaan rekursiivisesti muodostavilla algebrallisen tyyppisillä konstruktoreilla (siis nimi " rekursiivinen tietotyyppi "). Esimerkiksi tällainen asiakirja

<main> Tässä on tekstiä </main>

esitetään ohjelmassa seuraavalla tietorakenteella :

Tagged ( "pää" , [ Sana "Tässä" , Sana "on" , Sana "joku" , Sana "teksti" ] )

Tässä artikkelissa yhdistetään kahdentyyppisten konstruktorien käyttö - simple_xmlja list. Listan muodostava " " syntaksi [ , , ]on itse asiassa syntaktinen sokeri tyypin konstruktoriketjun yli list:

Tagged ( "pää" , Sana "Täällä" :: Sana "on" :: Sana "joku" :: Sana "teksti" :: nolla )

Vaikka tyyppi liston sisäänrakennettu kaikkiin XM-kirjoitettuihin kieliin, se määritellään muodollisesti rekursiiviseksi tietotyypiksi, on nollakonstruktori nilja binäärikonstruktori cons, jolla on yleensä infix-symbolinen nimi (kaksi kaksoispistettä klassisissa ML -murteissa tai yksi Haskellissa) .

tietotyyppi ' a list = nolla | :: ' a * ' listan liitetiedosto 5 :: _ _

Katso myös

Kirjallisuus

  • Riccardo Pucella. Notes on Programming Standard ML of New Jersey (  ( englanti ) ) // Viimeksi tarkistettu 10. tammikuuta 2001. - Cornell University, 2001.