Prezentace se nahrává, počkejte prosím

Prezentace se nahrává, počkejte prosím

Uživatelem definované typy doc. Dr. Ing. Miroslav Beneš  katedra informatiky, A-1007  59 732 4213.

Podobné prezentace


Prezentace na téma: "Uživatelem definované typy doc. Dr. Ing. Miroslav Beneš  katedra informatiky, A-1007  59 732 4213."— Transkript prezentace:

1 Uživatelem definované typy doc. Dr. Ing. Miroslav Beneš  katedra informatiky, A-1007  59 732 4213

2 2ÚDPJ - Uživatelem definované typy Definice uživatelského typu data Color = Red | Green | Blue Color – typový konstruktor Color – typový konstruktor Red / Green / Blue – datové konstruktory Red / Green / Blue – datové konstruktory data Point = Point Float Float dist (Point x1 y1) (Point x2 y2) = dist (Point x1 y1) (Point x2 y2) = sqrt ((x2-x1)**2 + (y2-y1)**2) sqrt ((x2-x1)**2 + (y2-y1)**2) dist (Point 1.0 2.0) (Point 4.0 5.0) = 5.0 dist (Point 1.0 2.0) (Point 4.0 5.0) = 5.0 data Point a = Point a a polymorfismus polymorfismus konstruktor Point :: a -> a -> Point a konstruktor Point :: a -> a -> Point a

3 3ÚDPJ - Uživatelem definované typy Součinové datové typy data Point = Point Int Int existuje jen jediná varianta existuje jen jediná varianta typová kontrola v době překladu typová kontrola v době překladu žádná kontrola v době běhu žádná kontrola v době běhu data Dvojice a b = Dvojice a b type Dvojice a b = (a,b) izomorfní s uspořádanými n-ticemi izomorfní s uspořádanými n-ticemi

4 4ÚDPJ - Uživatelem definované typy Součtové datové typy data Color = Red | Green | Blue existuje více variant existuje více variant každá varianta je součinovým typem každá varianta je součinovým typem nutnost kontroly v době běhu nutnost kontroly v době běhu isRed :: Color -> Bool isRed Red = True může nastat chyba: isRed Blue = ??? může nastat chyba: isRed Blue = ???

5 5ÚDPJ - Uživatelem definované typy Rekurzivní datové typy Seznam data List a = Null | Cons a (List a) lst :: List Int lst = Cons 1 (Cons 2 (Cons 3 Null)) append Null ys = ys append (Cons x xs) ys = Cons x (append xs ys)

6 6ÚDPJ - Uživatelem definované typy Rekurzivní datové typy Strom data Tree1 a = Leaf a | Branch (Tree1 a) (Tree1 a) data Tree2 a = Leaf a | Branch a (Tree2 a) (Tree2 a) data Tree3 a = Null | Branch a (Tree3 a) (Tree3 a) t2l (Leaf x) = [x] t2l (Branch lt rt) = (t2l lt) ++ (t2l rt)

7 7ÚDPJ - Uživatelem definované typy Synonyma datových typů type String = [Char] type Name = String data Address = None | Addr String type Person = (Name, Address) type Table a = [(String, a)] jsou ekvivalentní původním typům jsou ekvivalentní původním typům představují pouze zkratky představují pouze zkratky

8 8ÚDPJ - Uživatelem definované typy Zavedení nového typu newtype Natural = MakeNatural Int není ekvivalentní původnímu typu Int není ekvivalentní původnímu typu Int vyžaduje explicitní konverzní funkce vyžaduje explicitní konverzní funkce toNatural :: Int -> Natural toNatural x | x < 0 = error “Chyba” | otherwise = MakeNatural x | otherwise = MakeNatural x fromNatural :: Natural -> Int fromNatural (MakeNatural x) = x

9 9ÚDPJ - Uživatelem definované typy Pojmenované složky typů Selektor – vrací složku hodnoty data Point = Pt Float Float px :: Point -> Float px (Pt x y) = x data Point = Pt Float Float px :: Point -> Float px (Pt x y) = x Pojmenované složky = selektory data Point = Pt { px, py :: Float } abs (Pt px=x, py=y) = sqrt (x*x+y*y) abs p = sqrt ((px p)**2 + (py p)**2) data Point = Pt { px, py :: Float } abs (Pt px=x, py=y) = sqrt (x*x+y*y) abs p = sqrt ((px p)**2 + (py p)**2) Vytvoření modifikované kopie p { px = x } p { px = x }

10 10ÚDPJ - Uživatelem definované typy Typové třídy Kontext (C 1 a, C 2 b, …), resp. C a omezení na typové proměnné a, b,... omezení na typové proměnné a, b,... C 1, C 2... jsou typové třídy C 1, C 2... jsou typové třídy Typ  u. cx => t u – typové proměnné u – typové proměnné cx – kontext cx – kontext t – typový výraz t – typový výraz Př.: Eq a => a -> [a] -> Bool (Eq a, Num b) => (a, b) -> [a] Př.: Eq a => a -> [a] -> Bool (Eq a, Num b) => (a, b) -> [a]

11 11ÚDPJ - Uživatelem definované typy Definice typové třídy Definice signatury metod a implicitní metody class Eq a where (==), (/=) :: a -> a -> Bool x /= y = not (x == y) class Eq a where (==), (/=) :: a -> a -> Bool x /= y = not (x == y) Dědičnost class (Eq a) => Ord a where ( ),(>=) :: a -> a -> Bool max, min :: a -> a -> a class (Eq a) => Ord a where ( ),(>=) :: a -> a -> Bool max, min :: a -> a -> a class (Read a, Show a) => Textual a class (Read a, Show a) => Textual a

12 12ÚDPJ - Uživatelem definované typy Definice instance typové třídy instance Eq Int where x == y = intEq x y instance Eq a => Eq [a] where [] == [] = True (x:xs) == (y:ys) = x == y && xs == ys _ == _ = False instance (Eq q, Eq b) => Eq (a,b) where (x1,y1) == (x2,y2) = x1==x2 && y1==y2

13 13ÚDPJ - Uživatelem definované typy Základní typové třídy Eq a Eq a (==), (/=) (==), (/=) Eq a => Ord a Eq a => Ord a ( ), (>=), min, max ( ), (>=), min, max Enum a Enum a succ, pred succ, pred Read a Read a readsPrec readsPrec Show a Show a showsPres, show showsPres, show (Eq a, Show a) => Num a (Eq a, Show a) => Num a (+), (-), (*), negate, abs (+), (-), (*), negate, abs (Num a) => Fractional a (Num a) => Fractional a (/), recip (/), recip (Fractional a) => Floating a (Fractional a) => Floating a pi, exp, log, sqrt, (**), … pi, exp, log, sqrt, (**), …

14 14ÚDPJ - Uživatelem definované typy Třída Show Hodnoty převoditelné na řetězec type ShowS = String -> String class Show a where showsPrec :: Int -> a -> ShowS show :: a -> String showList :: [a] -> ShowS type ShowS = String -> String class Show a where showsPrec :: Int -> a -> ShowS show :: a -> String showList :: [a] -> ShowS showPoint :: Point -> String showPoint (Pt x,y) = “(“ ++ show x ++ ”;” ++ show y ++ ”)” showPoint :: Point -> String showPoint (Pt x,y) = “(“ ++ show x ++ ”;” ++ show y ++ ”)” instance Show Point where show p = showPoint p instance Show Point where show p = showPoint p

15 15ÚDPJ - Uživatelem definované typy Třída Read Hodnoty převoditelné z řetězce type ReadS a = String -> [(a,String)] class Read a where readsPrec :: Int -> ReadS a readList :: ReadS [a] type ReadS a = String -> [(a,String)] class Read a where readsPrec :: Int -> ReadS a readList :: ReadS [a] readsPoint :: ReadS Point readsPoint (‘(‘:s) = [ (Pt x y, s’’) | (x, ’;’:s’) <- reads s, (y, ‘)’:s;;) <- reads s’] readsPoint :: ReadS Point readsPoint (‘(‘:s) = [ (Pt x y, s’’) | (x, ’;’:s’) <- reads s, (y, ‘)’:s;;) <- reads s’] instance Read Point where readsPrec _ = readsPoint instance Read Point where readsPrec _ = readsPoint

16 16ÚDPJ - Uživatelem definované typy Příklady pro cvičení 1) Vyhledání maximální hodnoty ve stromu maxTree :: Ord a => Tree a -> a maxTree :: Ord a => Tree a -> a 2) Reprezentace aritmetického výrazu uživatelským datovým typem data Expr = Plus Expr Expr | … | Num Int data Expr = Plus Expr Expr | … | Num Int 3) Vyhodnocení výrazu eval :: Expr -> Int eval :: Expr -> Int 4) Převod výrazu na řetězec instance Show Expr where … instance Show Expr where …


Stáhnout ppt "Uživatelem definované typy doc. Dr. Ing. Miroslav Beneš  katedra informatiky, A-1007  59 732 4213."

Podobné prezentace


Reklamy Google