Datové typy



-- navrhněte datový typ pro binární vyhledávací stromy
-- (bez vyvažování) - chceme reprezentovat klíč -> hodnota
-- data BVS k h = Void | (BVS k h , (k, h) , BVS k h)
data BVS k h = Void | Branch (BVS k h) k h (BVS k h)


-- chceme: `find klíč strom :: Maybe hodnota`, analogicky k lookup
find _ Void = Nothing
find x (Branch l k h p)
    | x == k = Just h
    | x < k = find x l
    | x > k = find x p

    
-- chceme: vkládání (bez vyvažování)
insert k v Void = Branch Void k v Void
insert k v (Branch l k2 v2 r) = case compare k k2 of
     LT -> Branch (insert k v l) k2 v2 r
     EQ -> Branch l k v r 
     GT -> Branch l k2 v2 (insert k v r)



{-
Napište funkci

>	evalPostfix :: [Elem] -> Maybe Int

která vyhodnotí výraz a vrátí `Nothing`
pokud byl nekorektní nebo došlo k dělení nulou.

Pro tuto funkci potřebujete vytvořit datový typ `Elem`
pro jeden prvek postfixové notace obsahující čísla a operátory
(stačí sčítání, celočíselné dělení a unární mínus).

Postfixová notace se vyhodnocuje triviálně s operacemi
na pomocném zásobníku čísel (spojovém seznamu),
akorát je potřeba správně detekovat chyby a vrátit `Nothing`.
-}