Clase de tipuri
In limbajele traditionale orientate obiect, o declaratie de clasa defineste o schema caruia i se conformeaza mai multe obiecte numite instante ale clasei. La instantierea unui obiect trebuie de obicei furnizate VALORI pentru a fi stocate in obiect.Ele au NUMELE si TIPUL scrise in declaratia de clasa.
In Haskell insa, o declaratie de clasa defineste un tip abstract de date, inzestrat cu anumite functii. (Sunt un fel de clase de structuri algebrice, cum ar fi clasa grupurilor , a inelelor, a monadelor etc). La instantiere, un tip de date concret devine instanta a clasei, ocazie cu care trebuie sa precizam cum lucreaza acele functii (specifice clasei) pentru acel tip. La instantierea unei clase trebuie deci sa definim, sa furnizam, FUNCTIILE necesare. Ele au NUMELE si TIPUL scrise in declaratia de clasa.
In esenta clasele Haskell sunt colectii de structuri algebrice ! Tipul introdus cu instance in acea clasa este MULTIMEA DE VALORI iar FUNCTIILE pot fi OPERATIILE cu acele valori. Din ele pot rezulta si valori de alt tip.
Exemplu: clasa Eq (predefinita) este clasa tipurilor pentru a caror date exista operatorii egal == si diferit /=. Daca introduceti in clasa Eq niste arbori definiti de dumneavoastra (cu data) aveti ocazia sa definiti cu ocazia instantierii cum vor lucra egalitatea si diferitul pentru acei arbori.
Exemplu: Clasa Show e clasa valorilor afisabile, pentru care exista o functie show ce transforma acele valori in string-uri (tiparibile). Mai sunt si alte clase.
Utilizatorul poate introduce/defini propriile clase cu declaratia class si pune in clase propriile tipuri cu declarartia instance. Se admit si un fel de clase conditionate, in care ceva devine membru al clasei daca este deja membru al altei sau altor clase. Vedeti si folosirea lui => la declaratii de tipuri.
Se mai pot scrie multe lucruri. Este un concept puternic si foarte util la realizarea de aplicatii mari, modulare.
1. Cititi si raspunsul la intrebarea: Cum scriem o functie dependenta de tipul argumentului ?
2. Vedeti aici exemplul Z4 al claselor de resturi Z4 (-- click pe Z4 --) . Antrenament: Completati-l si testati-l. Faceti calcule in Z4.
3. Un exemplu (bonus!) de introducere a multimii posibile de solutii pentru ecuatiile de gradul I si al II-lea in Clasa Show (pentru a afisa rezultatele cum dorim) mi-a fost oferit de Smeu Florin si cu permisiunea lui il reproducem aici.
4. Mai jos aveti un mic exemplu in care numerele complexe, matematic neordonabile, se ordoneaza dupa modul. Acest lucru se face in doua etape:
Definim egalitatea a doua numere complexe dupa modul, astfel inscriindu-le pe numerele complexe in clasa Eq
Definim comparatia a doua numere complexe dupa modul, astfel inscriindu-le pe numerele complexe in clasa Ord
module Ordine where
-- haskell-L1-tipuri-de-date.hs
data Complexe = Complexe Float Float
instance Eq Complexe where
(==) (Complexe r1 i1) (Complexe r2 i2) = r1^2+i1^2 == r2^2+i2^2
instance Ord Complexe where
compare (Complexe r1 i1) (Complexe r2 i2) | r1^2+i1^2 == r2^2+i2^2 = EQ
| r1^2+i1^2 <= r2^2+i2^2 = LT
| otherwise = GT
x <= y = compare x y /= GT
x < y = compare x y == LT
x >= y = compare x y /= LT
x > y = compare x y == GT
Pagina indexata la indexul Categories:Ro
<= Inapoi la pagina principala Ro/Haskell.
<- Inapoi la Intrebarile incepatorului Ro/Haskell.