Clasa Show

From HaskellWiki
Revision as of 05:52, 20 November 2008 by Ha$kell (talk | contribs) (adding example instance Show , instance Wq)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Haskell - Clase de tipuri
Haskell - Clase de tipuri

Despre clase de tipuri

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.

Clasa Show

Clasa Show este clasa valorilor afisabile, pentru care exista o functie show ce transforma acele valori in string-uri (tiparibile). Mai sunt si alte clase. Vezi in exemplul final o instanta a clasei Eq (eq e clasa tipurilor de date inzestrate cu comparatii).

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 cu operatii de IO pe structuri de date complexe.

Notati ca putem introduce un tip in Clasa Show prin simpla adaugare a precizarii

deriving Show

dupa descrierea data' sau newtype a tipului resprectiv. Functia show (operatia de baza din calsa Show care va transforma data in String ) vi se va scrie / genera AUTOMAT.

Dar daca doriti altfel de afisare ... scrieti propriile dumneavoastra functii show in instantele claselor dorite.

1. 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 vom reproduce aici.

Ideea este ca solutiile ecuatiilor de gradul I si doi se pot reprezenta ca un tip de date:

data Solutii = DouaSolutii Float Float 
             | SolutieDubla Float
             | SolutiiComplexe Float Float  
             | Infinitate 
             | NiciUna

-- cele doua valori sunt parte a reala si cea imaginara la solutii complexe

Iar acest tip este introdus cu instance in clasa Show. (va urma)

Exemplul complet

Rezolvarea ecuatiilor de gradul I si al II lea. Diversele feluri de solutii formeaza un tip utilizator introdus in clasa Show si in clasa Eq (just for fun). Multumirile mele lui Smeu Florin care l-a trimis spre postare.

data Rezultat = Complex Float Float | Real Float Float | Inf | Nimic

instance Eq Rezultat where
	Nimic == Nimic = True
	Inf == Inf = True
	( Real x y ) == ( Real a b ) = ( x == a ) && ( y == b )
	( Complex x y ) == ( Complex a b ) = ( x == a ) && ( abs y == abs b )
	_ == _ = False

instance Show Rezultat where
	show ( Complex parte_reala parte_imaginara ) = "Ecuatia are doua solutii imaginare:\n1) "
		++ show parte_reala ++ " + " ++ show ( abs parte_imaginara ) ++ "i\n2) "
		++ show parte_reala ++ " - " ++ show ( abs parte_imaginara ) ++ "i"
	show ( Real sol1 sol2 ) = "Ecuatia are doua solutii reale:\n1) "
		++ show sol1 ++ "\n2) " ++ show sol2
	show Inf = "Ecuatia are o infinitate de solutii"
	show Nimic = "Ecuatia nu are nici o solutie"

ec1 :: Float -> Float -> Rezultat
ec1 a b		|a == 0 = if b == 0 then Inf else Nimic
		|otherwise = Real solutie solutie
			where solutie = ( -b / a )

ec2 :: Float -> Float -> Float -> Rezultat
ec2 a b c	|a == 0		= ec1 b c
		|delta < 0	= Complex ( -b / ( 2 * a ) )
					  ( sqrt ( -delta ) / ( 2 * a ) )
		|otherwise	= Real ( ( -b + sqrt ( delta ) ) / ( 2 * a ) )
				       ( ( -b - sqrt ( delta ) ) / ( 2 * a ) )
			where delta = b * b - 4 * a * c

Tema: Testati, rulati, verificati. Codul e oferit asa cum este, fara garantii, dar e bun ca exemplu de definire a afisarilor pentru un tip de date utilizator.


Pagina indexata la indexul Categories:Ro


<= Inapoi la pagina principala Ro/Haskell.

<- Inapoi la Intrebarile incepatorului Ro/Haskell.