Uivatelem definovan typy doc Dr Ing Miroslav Bene
Uživatelem definované typy doc. Dr. Ing. Miroslav Beneš katedra informatiky, A-1007 59 732 4213 ÚDPJ - Uživatelem definované typy
Definice uživatelského typu data Color = Red | Green | Blue n n Color – typový konstruktor Red / Green / Blue – datové konstruktory data Point = Point Float n n dist (Point x 1 y 1) (Point x 2 y 2) = sqrt ((x 2 -x 1)**2 + (y 2 -y 1)**2) dist (Point 1. 0 2. 0) (Point 4. 0 5. 0) = 5. 0 data Point a = Point a a n n polymorfismus konstruktor Point : : a -> Point a ÚDPJ - Uživatelem definované typy 2
Součinové datové typy data Point = Point Int n n n existuje jen jediná varianta typová kontrola v době překladu žádná kontrola v době běhu data Dvojice a b = Dvojice a b type Dvojice a b = (a, b) n izomorfní s uspořádanými n-ticemi ÚDPJ - Uživatelem definované typy 3
Součtové datové typy data Color = Red | Green | Blue n n n existuje více variant každá varianta je součinovým typem nutnost kontroly v době běhu is. Red : : Color -> Bool is. Red = True n může nastat chyba: is. Red Blue = ? ? ? ÚDPJ - Uživatelem definované typy 4
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) ÚDPJ - Uživatelem definované typy 5
Rekurzivní datové typy Strom data Tree 1 a = Leaf a | Branch (Tree 1 a) data Tree 2 a = Leaf a | Branch a (Tree 2 a) data Tree 3 a = Null | Branch a (Tree 3 a) t 2 l (Leaf x) = [x] t 2 l (Branch lt rt) = (t 2 l lt) ++ (t 2 l rt) ÚDPJ - Uživatelem definované typy 6
Synonyma datových typů type String = [Char] type Name = String data Address = None | Addr String type Person = (Name, Address) type Table a = [(String, a)] n n jsou ekvivalentní původním typům představují pouze zkratky ÚDPJ - Uživatelem definované typy 7
Zavedení nového typu newtype Natural = Make. Natural Int n n není ekvivalentní původnímu typu Int vyžaduje explicitní konverzní funkce to. Natural : : Int -> Natural to. Natural x | x < 0 = error “Chyba” | otherwise = Make. Natural x from. Natural : : Natural -> Int (Make. Natural x) = x ÚDPJ - Uživatelem definované typy 8
Pojmenované složky typů Selektor – vrací složku hodnoty n data Point = Pt Float px : : Point -> Float px (Pt x y) = x Pojmenované složky = selektory n 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 n p { px = x } ÚDPJ - Uživatelem definované typy 9
Typové třídy Kontext (C 1 a, C 2 b, …), resp. C a n n omezení na typové proměnné a, b, . . . C 1 , C 2. . . jsou typové třídy Typ u. cx => t n n u – typové proměnné cx – kontext t – typový výraz Př. : Eq a => a -> [a] -> Bool (Eq a, Num b) => (a, b) -> [a] ÚDPJ - Uživatelem definované typy 10
Definice typové třídy Definice signatury metod a implicitní metody n class Eq a where (==), (/=) : : a -> Bool x /= y = not (x == y) Dědičnost n n class (Eq a) => Ord a where (<), (<=), (>=) : : a -> Bool max, min : : a -> a class (Read a, Show a) => Textual a ÚDPJ - Uživatelem definované typy 11
Definice instance typové třídy instance Eq Int where x == y = int. Eq 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 (x 1, y 1) == (x 2, y 2) = x 1==x 2 && y 1==y 2 ÚDPJ - Uživatelem definované typy 12
Základní typové třídy Eq a (==), (/=) Eq a => Ord a (<), (<=), (>=), min, max Enum a succ, pred Read a reads. Prec Show a shows. Pres, show (Eq a, Show a) => Num a (+), (-), (*), negate, abs (Num a) => Fractional a (/), recip (Fractional a) => Floating a pi, exp, log, sqrt, (**), … ÚDPJ - Uživatelem definované typy 13
Třída Show Hodnoty převoditelné na řetězec n n n type Show. S = String -> String class Show a where shows. Prec : : Int -> a -> Show. S show : : a -> String show. List : : [a] -> Show. S show. Point : : Point -> String show. Point (Pt x, y) = “(“ ++ show x ++ ”; ” ++ show y ++ ”)” instance Show Point where show p = show. Point p ÚDPJ - Uživatelem definované typy 14
Třída Read Hodnoty převoditelné z řetězce n n n type Read. S a = String -> [(a, String)] class Read a where reads. Prec : : Int -> Read. S a read. List : : Read. S [a] reads. Point : : Read. S Point reads. Point (‘(‘: s) = [ (Pt x y, s’’) | (x, ’; ’: s’) <- reads s, (y, ‘)’: s; ; ) <- reads s’] instance Read Point where reads. Prec _ = reads. Point ÚDPJ - Uživatelem definované typy 15
Příklady pro cvičení 1) Vyhledání maximální hodnoty ve stromu n max. Tree : : Ord a => Tree a -> a 2) Reprezentace aritmetického výrazu uživatelským datovým typem n data Expr = Plus Expr | … | Num Int 3) Vyhodnocení výrazu n eval : : Expr -> Int 4) Převod výrazu na řetězec n instance Show Expr where … ÚDPJ - Uživatelem definované typy 16
- Slides: 16