14 aprilie 2010

Tipuri de date in Haskell

-- tipul nr naturale

data Natural =
Zero |
Succ Natural
deriving Show

--fct pt predecesor
prede (Succ n) = n

-- egalitate
equal Zero Zero = True
equal (Succ n) Zero = False
equal Zero (Succ n) = False
equal m n =
if equal (prede m) (prede n)== True then True
else False

-- aduna 2 nr naturale
add n Zero = n
add m n =
Succ (add m (prede n))

-- diferenta a doua nr
subs n Zero = n
subs m n =
if (equal m n) then Zero
else prede (subs m ( prede n))

-- a mai mare ca b
gt (Succ n) Zero = True
gt Zero (Succ n) = False
gt m n =
if equal m n then False
else gt m n

-- a mai mic ca b
lt (Succ n) Zero = False
lt Zero (Succ n) = True
lt m n =
if equal m n then False
else lt m n

-- inmultire
mult n Zero = Zero
mult Zero n = Zero
mult (Succ n) (Succ Zero) = (Succ n)
mult (Succ Zero) (Succ n) = (Succ n)
mult m n =
add (mult (prede m) n) n


-- tipul List

data List a =
Empty |
Cons a (List a)
deriving Show

-- lungimea unei liste
lung Empty = 0
lung (Cons x lista) = 1 + lung lista

-- concatenare
conc Empty l = l
conc (Cons x lista) l =
Cons x (conc lista l)


-- tipul Tree, arbore binar de cautare

data Tree a =
Null |
Frunza a |
Nod (Tree a) a (Tree a)
deriving Show

-- inserare intr-un arbore binar
insert t Null = Frunza t
insert t (Frunza a) =
if (t < a) then Nod (Frunza t) a Null
else Nod Null a (Frunza t)
insert x (Nod left t right) =
if (x < t) then Nod (insert x left) t right
else Nod left t (insert x right)

-- construieste un arbore binar de cautare pornind de la o lista
constr Empty = Null
constr (Cons a lista) =
insert a (constr lista)

-- numara elem din arbore
numar Null = 0
numar (Frunza a) = 1
numar (Nod left x right) = 1 + numar left + numar right

-- adancimea arborelui
maxim a b =
if (a < b) then b
else a

adan Null = 0
adan (Frunza x) = 1
adan (Nod left x right) = 1 + maxim (adan left) (adan right)

-- o lista cu elem din arborele parcurs inordine - SRD (lista sortata)
srd (Frunza a) = Cons a Empty
srd Null = Empty
srd (Nod left a right) =
conc (srd left) (Cons a (srd right))

Niciun comentariu: