Constructor (programare funcțională)

În teoria tipurilor și limbajele de programare funcțională, un constructor de tip de date algebric sau pur și simplu un constructor este o funcție cu un corp gol care construiește un obiect de tip de date algebric . Compilatoarele de optimizare execută aceste funcții static, adică în timpul compilării .

Tipurile de date algebrice sunt un element important al limbajelor tipizate Hindley-Milner .

Exemplu

Cea mai simplă structură a unui document XML în Standard ML poate fi definită după cum urmează:

tip de date simple_xml = Gol | cuvânt de șir | Tagged of string * simple_xml list

Aceasta este definiția unui tip de date algebrice . Introduce patru identificatori în program: un constructor de tip simple_xml nular și trei constructori de obiect de acest tip algebric: nullary Empty , unary Wordși binary Tagged. Acesta din urmă ia doi parametri (în acest caz ca un tuplu ), al doilea dintre care are un tip simple_xml list(adică o listă de obiecte de tipul definit aici). Astfel, simple_xmleste un tip de date recursive .

Constructorii au toate drepturile funcțiilor (de exemplu, un constructor Wordare un tip de funcție " string -> simple_xml") și, în special, pot fi utilizați în abstractizarea funcției .

fun listOfWords s = hartă Word ( String . tokens Char . isSpace s ) fun toString e = let val scat = String . concat în cazul e de Empty => "" | Cuvântul s => s ^ " " | Tagged ( tag , contents ) => scat [ "<" , tag , ">" , scat ( map toString contents ), "</" , tag , ">" ] end

În corpul funcției listOfWords, puteți vedea cum constructorul este Wordtransmis ca parametru funcției mapși îl aplică fiecărui element din lista de șiruri de caractere pe care îl primește ca al doilea parametru. Lista de șiruri, la rândul ei, se obține prin tokenizarea (în acest caz, pur și simplu ruperea în cuvinte) șirul pe care funcția l-a primit ca listOfWordsparametru de intrare.

Fiecare aplicare a unui constructor Wordla un obiect de tip „șir” produce un obiect de tip simple_xml. Aceste obiecte copil sunt apoi folosite pentru a construi o listă (acest lucru se întâmplă în interiorul map) - astfel încât rezultatul funcției listOfWordsva fi o listă de obiecte de tip simple_xml. Acest lucru este confirmat de tipul său de funcție , care este dedus de compilator: " string -> simple_xml list". În consecință, rezultatul funcției poate fi utilizat direct ca parametru pentru un alt constructor de acest tip - Tagged - care va crea un nou obiect de tip simple_xml:

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

Astfel, un document XML este construit prin compunerea recursiva a constructorilor de tip algebric (de unde și denumirea de „ tip de date recursive ”). De exemplu, un astfel de document

<main> Iată un text </main>

va fi reprezentat în program prin următoarea structură de date :

Etichetat ( „principal” , [ Cuvântul „Aici” , Cuvântul „este” , Cuvântul „unele” , Cuvântul „text” ] )

Această intrare combină utilizarea a două tipuri de constructori - simple_xmlși list. Sintaxa „ ” [ , , ]care construiește o listă este de fapt zahar sintactic peste un lanț de constructori de tip list:

Etichetat ( „principal” , Cuvântul „Aici” :: Cuvântul „este” :: Cuvântul „unele” :: Cuvântul „text” :: nul )

Deși tipul listeste încorporat în toate limbile tip XM , este definit în mod formal ca un tip de date recursive un constructor nul nilși un constructor binar conscare are de obicei un nume simbolic infix (două două puncte în dialectele clasice ML sau unul în Haskell) .

tipul de date ' a list = nil | :: din ' a * ' o listă infixr 5 ::

Vezi și

Literatură

  • Riccardo Pucella. Note privind standardul de programare ML din New Jersey (  ( engleză ) ) // Ultima revizuire 10 ianuarie 2001. - Universitatea Cornell, 2001.