Uživatelem definované typy Ing. Lumír Návrat  katedra informatiky, A 1018  59 732 3252.

Slides:



Advertisements
Podobné prezentace
Pro začátek něco lehčího
Advertisements

Tomáš Petříček Microsoft C# MVP
Vstup a výstup Ing. Lumír Návrat  katedra informatiky, A-1018 
Vstup a výstup doc. Dr. Ing. Miroslav Beneš  katedra informatiky, A-1007 
Programovací jazyk C++
Třída SIMSET je druhou standardní systémovou třídou, která obsahuje prostředky pro práci se spojovými seznamy. KRUHOVÉ SPOJOVÉ SEZNAMY Spojový seznam –
Programování funkcí v Excelu
Uživatelem definované typy doc. Dr. Ing. Miroslav Beneš  katedra informatiky, A-1007 
JUI - 3. přednáška Zpracování seznamů, predikátové a vyhodnocovací funkce RNDr. Jiří Dvořák, CSc.
Seznamy v jazyce Haskell doc. Dr. Ing. Miroslav Beneš  katedra informatiky, A-1007 
Cvičení Úloha 1: Rozhodněte zda posloupnost znaků v poli délky n tvoří palindrom (slovo, které je stejné při čtení zprava i zleva). Př.: [a,l,e,l,a] [a,n,n,a]
10. Dynamické datové struktury
Fronta - a)Implementace s využitím statických struktur (pole) b)Implementace s využitím dynamických struktur (spojového seznamu) odebírá se ze začátku.
Fakulta elektrotechniky a informatiky
BLIŽŠÍ POHLED NA TŘÍDY, DĚDIČNOST - úvod
Programování v Pascalu Přednáška 3
Programování v Pascalu Přednáška 5 RNDr. Hana Havelková.
Programování v Pascalu Přednáška 9 RNDr. Hana Havelková.
Programovací jazyk Haskell Ing. Lumír Návrat  katedra informatiky, A 1018 
Materiály k přednášce Úvod do programování Ondřej Čepek.
Skip-List je datová struktura, která může být použita jako náhrada za vyvážené stromy. představují pravděpodobnostní alternativu k vyváženým stromům (struktura.
Objekty v CLIPSu RNDr. Jiří Dvořák, CSc.
C# - struktury, výčtové typy, pole
Seminář C++ 9. cvičení Šablony Ing. Jan Mikulka. Šablony ► template – vzory, podle kterých může překladač tvořit skupiny podobných tříd nebo funkcí, které.
Objektové programování
Datové struktury a algoritmy Část 5 Abstraktní datové typy
Datové typy a práce s nimi
DEKLARACE PROMĚNNÝCH A KONSTANT
Návrh a tvorba WWW Přednáška 11
Seminář C++ 4. cvičení Objekty Ing. Jan Mikulka. Co je objekt ► obraz třídy i instance ► třída – definovaná za pomocí klíčového slova class ► instance.
6. cvičení Polymorfismus
Další abstraktní datové typy
Informatika I 4. přednáška
Abstraktní datové typy doc. Dr. Ing. Miroslav Beneš  katedra informatiky, A-1007 
KIV/PPA1 cvičení 8 Cvičící: Pavel Bžoch. Osnova cvičení Objekty v Javě Třída Konstruktor Metody Metody a proměnné třídy x instance Program sestávající.
OSNOVA: a) Úvod do OOPb) Třídy bez metod c) Třídy s metodamid) Konstruktory a destruktory e) Metody constf) Knihovní třídy g) Třídy ve tříděh) Přetížení.
IB111 Programování a algoritmizace
Funkcionální programování Haskell
OSNOVA: a) Přetížení členských funkcí b) Dědičnost tříd Jiří Šebesta Ústav radioelektroniky, FEKT VUT v Brně Počítače a programování 2 pro obor EST BPC2E.
Dědičnost - inheritance dědičnost je jednou z forem znovupoužitelnosti dědičnost je jednou z forem znovupoužitelnosti B A Třída A je předkem třídy B Třída.
7. Typ soubor Souborem dat běžně rozumíme uspořádanou množinu dat, uloženou mimo operační paměť počítače (na disku). Pascalský soubor je abstrakcí skutečného.
13/04/20151 Indexery (1) Členy třídy (struktury) umožňující třídě (struk- tuře) používat hranaté závorky a pracovat s ní podobně jako s polem (používat.
Programovací jazyk Haskell doc. Dr. Ing. Miroslav Beneš  katedra informatiky, A-1007 
Algoritmizace a programování Textové soubory - 13 Mgr. Josef Nožička IKT Algoritmizace a programování
Metodika objektového přístupu při tvorbě překladačů. Marek Běhálek Informatika a aplikovaná matematika FEI VŠB-TU Ostrava.
XQuery Dotazovací jazyk XML Daniel Privalenkov. O čem bude prezentace Nutnost dotazovacího jazyku v XML Rychlý přehled XQuery Několik příkladů.
Seznamy v jazyce Haskell Ing. Lumír Návrat  katedra informatiky, D-403 
Pokročilé programování v C++ (část B)
ZÁKLADNÍ POJMY. ZDROJOVÝ TEXT PROGRAMU Tvoří: klíčová slova komentáře identifikátory.
Jazyk C A0B36PRI - PROGRAMOVÁNÍ Část II.
4. Typ pole 4.1 Jednorozměrná pole
Kam se ubírá jazyk C#? Dr. Ing. Dalibor Kačmář Academic Developer Evangelist Developer & Platform Evangelist Group Microsoft Czech & Slovakia Anders Hejlsberg.
Úvod do UNIXu (6th round)
Fce VB - matematické Abs( výraz ) Fix( výraz ) Int( výraz) Sgn(výraz )
Iterator Iterator – Problém struct Item { int _value; Item * _next; Item( int value, Item * next ) : _value( value ), _next( next ) { } }; void Print(
Funkcionální programování Haskell Jan Hric, KTIML MFF UK,
PROGRAMOVÁNÍ 3ITA,3ITB Jaroslav Burdys Hlavní zdroj:
Praha & EU: Investujeme do vaší budoucnosti Evropský sociální fond Gymnázium, Praha 10, Voděradská 2 Projekt OBZORY Datové typy a operátory Základní programové.
Y36PJC Programování v jazyce C/C++
Programování ENUM, SWITCH,pole jednorozměrná a vícerozměrná, deklarace, inicializace, kopírování, porovnání Erik Král.
Programovací jazyk C++
Y36PJC Programování v jazyce C/C++
Výukový materiál zpracován v rámci projektu
Programování 2. hodina RNDr. Jan Lánský, Ph.D.
Dynamické proměnné (1) Proměnné, jejichž počet a (nebo) velikost pa-měti využívané těmito proměnnými se v prů-běhu programu mění Dynamické proměnné lze.
Typ pole (1) Proměnná typu pole představuje kolekci proměnných stejného datového typu, které mohou být označovány společným jménem (identifikátorem) Pole.
Programovací jazyk Haskell
C# přehled vlastností.
Funkcionální programování Haskell
CU01 Informatika II 2/13 Základy algoritmizace
Transkript prezentace:

Uživatelem definované typy Ing. Lumír Návrat  katedra informatiky, A 1018 

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

FLP - Uživatelem definované typy3 Součinové datové typy data Point = Point Int Int 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) izomorfní s uspořádanými n-ticemi

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

FLP - Uživatelem definované typy5 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)

FLP - Uživatelem definované typy6 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)

FLP - Uživatelem definované typy7 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 představují pouze zkratky

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

FLP - Uživatelem definované typy9 Pojmenované složky typů Selektor – vrací složku hodnoty 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) Vytvoření modifikované kopie p { px = x }

FLP - Uživatelem definované typy10 Motivace Funkce elemBool elemBool :: Bool -> [Bool] ->Bool elemBool x [] = false elemBool x (y:ys) = (x == Bool y) || elemBool x ys Funkce elemInt elemInt :: Int -> [Int] ->Bool Funkce elemGen elemGen :: (a -> a ->Bool) -> a -> [a] -> Bool elemGen (== Bool )

FLP - Uživatelem definované typy11 Řešení ? Funkce elem elem :: a -> [a] -> Bool Výhody Znovupoužitelnost Adaptibilita Nevýhody Jak omezit na porovnatelné typy? elem sin [sin,cos,tg] -> co je výsledek? Řešení elem :: Eq a => a -> [a] -> Bool

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

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

FLP - Uživatelem definované typy14 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

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

FLP - Uživatelem definované typy16 Hierarchie tříd

FLP - Uživatelem definované typy17 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 showPoint :: Point -> String showPoint (Pt x,y) = “(“ ++ show x ++ ”;” ++ show y ++ ”)” instance Show Point where show p = showPoint p

FLP - Uživatelem definované typy18 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] readsPoint :: ReadS Point readsPoint (‘(‘:s) = [ (Pt x y, s’’) | (x, ’;’:s’) <- reads s, (y, ‘)’:s;;) <- reads s’] instance Read Point where readsPrec _ = readsPoint

FLP - Uživatelem definované typy19 Moduly Definice modulu module A where -- A.hs, A.lhs... všechny definice jsou viditelné Import modulu module A where import B... dovezou se všechny viditelné definice

FLP - Uživatelem definované typy20 Moduly Omezení exportu module Expr ( printExpr, Expr(..) ) where Expr(..)– exportuje i konstruktory Expr– pouze export jména typu Omezení dovozu import Expr hiding( printExpr ) import qualified Expr -- Expr.printExpr import Expr as Vyraz -- Vyraz.printExpr

FLP - Uživatelem definované typy21 Motivace Cíl: Vytvoření kalkulátoru pro číselné výrazy čtení a zápis hodnot proměnných Modely zapisovatelné paměti seznam dvojic: [(String, Int)] funkce: (String -> Int) Operace initial :: Store value :: Store -> String -> Int update :: Store -> String -> Int -> Store

FLP - Uživatelem definované typy22 Abstraktní datový typ Omezené rozhraní type Store = [(Int, Var)] s1, s2:: Store -> Co je to s1++s2 ? Nezávislost rozhraní na implementaci type Store = Var -> Int s1, s2:: Store -> s1++s2 nefunguje Podmínky pro ADT definice veřejného rozhraní implementace typu není dostupná

FLP - Uživatelem definované typy23 ADT a Haskell ADT je definován v samostatném modulu Explicitní export operací Export pouze jména typu bez konstruktorů module Store (Store, initial, -- Store value, -- Store -> String -> Int update -- Store -> String -> Int -> Store ) where

FLP - Uživatelem definované typy24 Implementace - seznam Definice typu data Store = Sto [(String, Int)] newtype Store = Sto [(String, Int)] Definice operací initial :: Store initial = Sto [] value :: Store -> String -> Int value (Sto []) _ = 0 value (Sto ((w,n):sto)) v | v == w = n | otherwise = value (Sto sto) v update :: Store -> String -> Int -> Store update (Sto sto) v n = Sto ((v,n):sto)

FLP - Uživatelem definované typy25 Implementace - funkce Definice typu newtype Store = Sto (String -> Int) Definice operací initial :: Store initial = Sto (\v -> 0) value :: Store -> String -> Int value (Sto sto) v = sto v update :: Store -> String -> Int -> Store update (Sto sto) v n = Sto (\w -> if v==w then n else sto w)

FLP - Uživatelem definované typy26 Obecné principy návrhu ADT Identifikace a pojmenování typů Neformální popis typů Signatury typů Jak vytvořit objekt daného typu? Jak zjistit, o jaký druh objektu jde? Jak se dostaneme ke složkám typu? Můžeme provádět transformace objektů? Jak můžeme objekty kombinovat? Můžeme objekty agregovat?

FLP - Uživatelem definované typy27 ADT Fronta inicializace: emptyQ test prázdné fronty: isEmptyQ vložení na konec fronty: addQ výběr prvku ze začátku fronty: remQ module Queue ( Queue, emptyQ,-- Queue a isEmptyQ,-- Queue a -> Bool addQ,-- a -> Queue a -> Queue a remQ-- Queue q -> (a, Queue a) ) where

FLP - Uživatelem definované typy28 Implementace fronty 1 -- vkládáme na konec, vybíráme ze začátku seznamu newtype Queue a = Qu [a] emptyQ = Qu [] isEmptyQ (Qu q) = empty q addQ x (Qu xs) = Qu (xs++[x]) remQ xs) | not (isEmptyQ q) = (head xs, Qu (tail xs)) | otherwise = error “remQ”

FLP - Uživatelem definované typy29 Implementace fronty 2 -- vkládáme na začátek, vybíráme z konce seznamu addQ x (Qu xs) = Qu (x:xs) remQ xs) | not (isEmptyQ q) = (last xs, Qu (init xs)) | otherwise = error “remQ” složitost addQ/remQ konstantní – na začátku seznamu lineární – na konci seznamu

FLP - Uživatelem definované typy30 Implementace fronty 3 newtype Queue a = Qu [a] [a] emptyQ = Qu [] [] isEmptyQ (Qu [] []) = True isEmptyQ _ = False addQ x (Qu xs ys) = Qu xs (x:ys) remQ (Qu (x:xs) ys) = (x, Qu xs ys) remQ (Qu [] ys) = remQ (Qu (reverse ys) []) remQ (Qu [] []) = error “remQ”

FLP - Uživatelem definované typy31 Příklady pro cvičení 1) Vyhledání maximální hodnoty ve stromu 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 3) Vyhodnocení výrazu eval :: Expr -> Int 4) Převod výrazu na řetězec instance Show Expr where …