Laboratorul 14.

Realizați o arhitectură unificată, similară cu Collections, pentru manipularea listelor care să conțină:

  • interfața Function, parametrizată corespunzător, care conține o metodă execute, având ca parametru un obiect de tip A și un rezultat de tip B, unde A și B sunt două tipuri formale;
  • interfața Addition folosită pentru a calcula suma a două numere de tip T, unde T este un subtip al lui Number (aceasta va conține o metodă zero care va întoarce elementul neutru al operației de adunare și o metodă add, care primește două obiecte de tip T și returnează suma lor);
  • doi algoritmi polimorfici: reverse care inversează elementele unei liste și sum care calculează suma elementelor din listă; acești algoritmi trebuie să poată fi folosiți pe implementări diferite de liste, deoarece le abordează la nivel de interfață;
  • o serie de metode care au un comportament similar cu funcționalele din paradigma funcțională. În cadrul acestei paradigme, funcțiile sunt valori de ordinul 1 ce pot fi manipulate ca orice altă valoare, iar funcționalele sunt funcții care manipulează alte funcții, primindu-le ca argumente sau returnându-le ca rezultat, în functie de cum e nevoie, fiind foarte utile în aplicarea anumitor modele de calcul des folosite.

Veți porni implementarea de la clasa ListUtil, pusă la dispoziție în arhiva laboratorului.

Explicatii pentru functionale:

-foldl(function, init, list)- returnează rezultatul aplicării functiei function pe rând asupra unui element din listă si a unui acumulator init. Ordinea folosirii elementelor din listă este de la stânga la dreapta; Exemplu: foldl(f(x, y) = x + y, 5, [0, 1, 2, 3]) ⇒ 11

-foldr(function, init, list)- are un comportament similar cu foldl, însă ordinea folosirii elementelor din listă este de la dreapta la stânga; Exemplu: foldr(f(x, y) = y, 4, [0, 1, 2, 3]) ⇒ 0

-map(function, list)- returnează lista rezultatelor aplicării unei functii f asupra fiecărui element dintr-o listă; Exemplu: map(f(x) = 2*x,[0, 1, 2, 3]) ⇒ [0, 2, 4, 6]

-filter(predicat, list)- returnează lista elementelor dintr-o listă care satisfac un predicat p (un predicat îl vom percepe ca o functie care are un rezultat de tip Boolean); Exemplu: filter(f(x) = x % 2 == 0, P[0, 1, 2, 3]) ⇒ [0, 2]

-reduce(function, list)- aplică functia pentru primele două elemente din lista, apoi pentru rezultatul obtinut anterior si urmatorul element si tot asa; Exemplu: reduce(f(x, y) = x + y, [47, 11, 42, 13]) ⇒ 113

-all(predicat, list)- primeste un predicat (metoda ce are ca rezultat un boolean) si verifică dacă toate elementele din listă satisfac predicatul; Exemplu: all(f(x) = x > 0, [0, 1, 2, 3]) ⇒ True ; all(f(x) = x % 2 == 0, [0, 1, 2, 3]) ⇒ False

-any(predicat, list)- primeste un predicat si verifică dacă exista cel putin un element în lista care satisface predicatul. Exemplu: any(f(x) = x < 0,[1, 2, 3, 4]) ⇒ False ; any(f(x) = x % 2 == 0,[1, 2, 3]) ⇒ True

Pentru testare, completati exemplele din clasa Test.

Arhiva laborator

poo/laboratoare/15.txt · Last modified: 2023/01/17 20:09 by mihai.nan
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0