Miranda (limbaj de programare)

De la Wikipedia, enciclopedia liberă.
Salt la navigare Salt la căutare
Miranda
limbaj de programare
Autor David Turner
Data de origine 1985
Paradigme programare declarativă și programare pur funcțională
Influențată de Limbaj de programare ML și Kent Recursive Calculator
Implementare referință
Site-ul web miranda.org.uk

Miranda este un limbaj de programare pur funcțional dezvoltat de David Turner ca succesor al limbajelor sale de programare anterioare SASL și KRC folosind câteva concepte de la ML și Hope . Comercializat de Research Software Ltd. din Anglia, al cărui cuvânt „Miranda” este o marcă comercială, acesta a fost primul limbaj funcțional destinat comercial, mai degrabă decât pentru utilizare academică.

Soluția multor exemple de probleme este mai scurtă și mai simplă în Miranda decât în ​​majoritatea celorlalte limbaje de programare populare, cu posibila excepție a APL și, ca și în alte limbaje funcționale, utilizatorii săi raportează că pot produce mai multe programe. Fiabile cu cicluri de dezvoltare mai scurte. decât limbile imperative utilizate anterior.

A fost publicat în 1985 și pentru acesta a fost scris un singur interpret pentru sistemele Unix (în limbajul C ). Haskell , un limbaj dezvoltat ulterior, este similar în multe privințe cu Miranda.

Descriere

Miranda este un limbaj leneș pur funcțional , adică nu are funcționalități imperative sau efecte secundare.

Un program Miranda (numit și script ) este un set de ecuații care definesc diferite funcții matematice și tipuri de date algebrice. Cuvântul împreună este important, în acest context: ordinea în care sunt listate ecuațiile, în general, este irelevantă și nu este necesar să se definească o entitate înainte de ao utiliza.

Deoarece interpretul folosește inteligent indentarea, rareori este nevoie de definiții între paranteze și nu sunt necesare semne terminale ale definițiilor. această caracteristică este prezentă și în limbajele de programare Occam și Haskell și a fost popularizată de Python .

Părțile de comentarii sunt introduse în linii normale cu caracterele || și continuați până la sfârșitul aceleiași linii. Un tip convențional de comentariu alternativ este pentru un întreg fișier de cod sursă, numit un script cu litere , în care fiecare linie este considerată un comentariu, cu excepția cazului în care începe cu un semn > .

Tipurile de date de bază din Miranda sunt caractere, numere și simboluri. Un șir de caractere este pur și simplu o listă de caractere, în timp ce un număr este convertit sub acoperire în două forme de bază: numere întregi de precizie infinită în mod implicit și valori în virgulă mobilă, dacă este necesar.

Tuplurile sunt secvențe potențial mixte, asemănătoare înregistrărilor în limbi asemănătoare cu Pascal și sunt scrise între paranteze:

 this_employee = ("Follanda, Maria", 10560, False, 35)

Lista, însă, este structura de date utilizată mai des în Miranda. Este scris între paranteze pătrate și cu elemente separate prin virgule și toate de același tip:

 days_week = ["luni", "marți", "miercuri", "joi", "vineri"]

Concatenarea listelor este ++ , extragerea este -- , construcția este : dimensionarea este # și indexarea este ! , prin urmare:

 days = days_week ++ ["Sat", "Sun"]
 days = "Nil": zile
 zile! 0
-> „Nil”
 zile = zile - ["Nil"]
-> 7

Există mai multe comenzi rapide pentru listele de construcții: .. este utilizat pentru listele ale căror elemente formează o serie aritmetică, cu posibilitatea de a specifica un increment diferit de 1:

 fac n = produs [1..n]
 odd_sum = sum [1,3..100]

Ajutoarele mai generale și mai puternice pentru construirea listelor sunt oferite de „cunoașterea listelor” (denumite anterior „expresii ZF”), care se prezintă în două forme: o expresie aplicată unei serii de termeni, de exemplu:

 pătrate = [n * n | n <- [1 ..]]

(care citește: o listă de n pătrat unde n este luat din lista tuturor numerelor întregi pozitive)

și o serie în care fiecare termen este o funcție a celui precedent, de exemplu:

 puteri_de_2 = [n | n <- 1, 2 * n ..]

După cum se deduce din aceste două exemple, Miranda permite utilizarea listelor cu un număr infinit de elemente, dintre care cel mai simplu este lista numerelor întregi pozitive: [1..] .

Notarea pentru aplicarea funcției este juxtapunerea simplă ca în sin x . În Miranda, la fel ca în multe alte limbaje pur funcționale, funcțiile sunt cetățeni de primă clasă, adică pot fi atribuite ca parametri altor funcții, obținute ca rezultate sau incluse ca elemente în structurile de date. Mai important, o funcție care necesită doi sau mai mulți parametri poate fi „parțial parametrizată”, oferindu-i mai puțini parametri globali. Aceasta creează o altă funcție care, având în vedere parametrii rămași, va returna rezultatul. De exemplu:

 adăugați ab = a + b
 increment = adauga 1

este un mod indirect de a crea o funcție de „incrementare” care adaugă 1 la argumentul său. De fapt, add 4 7 ia funcția cu doi parametri add , o aplică la 4 rezultând o funcție cu un singur parametru care adaugă 4 la argumentul său, apoi o aplică la 7 .

Orice funcție cu doi parametri poate fi transformată într-un operator infix (de exemplu, dată fiind definiția funcției add anterioare, termenul $add este pe deplin echivalent cu operatorul + ) și orice operator infix cu doi parametri poate fi transformat în funcţie.

Asa:

 increment = (+) 1

este cel mai rapid mod de a crea o funcție care adaugă 1 la argumentul său.

În mod similar, în

 jumătate = (/ 2)
 reciproc = (1 /)

două funcții sunt generate cu un singur parametru. Interpretul înțelege în fiecare dintre cele două cazuri care parametru dintre cei doi operatori de diviziune este furnizat și creează funcțiile care împart numărul ubn în două și îi returnează reciproc.

Deși Miranda este un limbaj puternic bazat pe modele, nu necesită declarații de model explicite. Dacă un tip de funcție nu este declarat în mod explicit, interpretul îl deduce din tipul parametrilor săi și modul în care sunt utilizați în funcție. Pe lângă tipurile de bază, caractere, numere, simboluri, limba include „orice” tip în care tipul de parametru nu contează, ca în funcția care inversează o listă:

 rev [] = []
 rev (a: x) = rev x ++ [a]

care poate fi aplicat unei liste cu orice tip de date, deci declarația explicită a tipului de funcție ar fi:

 rev :: [*] -> [*]

În cele din urmă, limbajul are mecanisme pentru crearea și gestionarea modulelor de programe ale căror funcții interne sunt invizibile pentru programele care apelează aceste module.

Exemple de programe Miranda

Următorul script Miranda determină setul tuturor subseturilor unui set de numere

 subseturi [] = 
  subseturi (x: xs) = [[x] ++ y | y <- ys] ++ ys
                   unde ys = subseturi xs

iar acest lucru este un script pentru o știință de carte primes funcție care dă lista tuturor numerelor prime

 > || Lista infinită a tuturor numerelor prime, folosind sita Eratostene.
  
  Lista numerelor prime potențiale începe cu lista numerelor întregi de la două înainte; 
  după ce fiecare prim a fost returnat, toate numerele care pot fi împărțite în 
  modalitatea exactă pentru aceasta sunt eliminate din lista de candidați.
   
  > primii = sită [2 ..]
  > sită (p: x) = p: sită [n | n <- x; n mod p ~ = 0]

linkuri externe

Controlul autorității LCCN (EN) sh94005695 · BNF (FR) cb13328566r (data)