Definice uživatelského typu. Uživatelem definované typy. Součinové datové typy. Součtové datové typy. FLP - Uživatelem definované typy

Podobné dokumenty
Programovací jazyk Haskell

Programovací í jazyk Haskell

IB015 Neimperativní programování. Časová složitost, Typové třídy, Moduly. Jiří Barnat Libor Škarvada

IB015 Neimperativní programování. Seznamy, Typy a Rekurze. Jiří Barnat Libor Škarvada

Obsah přednášky. programovacího jazyka. Motivace. Princip denotační sémantiky Sémantické funkce Výrazy Příkazy Vstup a výstup Kontinuace Program

Abstraktní datové typy

Základní datové struktury

Motivace. Vstup a výstup. Minimální komunikace. Motivace. ÚDPJ - Vstup a výstup. Ing. Lumír Návrat katedra informatiky, A

Úvod do programovacích jazyků (Java)

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Abstraktní datové typy: zásobník

Algoritmizace prostorových úloh

Fronta (Queue) Úvod do programování. Fronta implementace. Fronta implementace pomocí pole 1/4. Fronta implementace pomocí pole 3/4

Algoritmizace prostorových úloh

Tabulka symbolů. Vazba (binding) Vazba - příklad. Deklarace a definice. Miroslav Beneš Dušan Kolář

ADT/ADS = abstraktní datové typy / struktury

Základní pojmy. Úvod do programování. Základní pojmy. Zápis algoritmu. Výraz. Základní pojmy

Programovací jazyk Pascal

Paradigmata programování 1

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15

Teoretické minimum z PJV

Ahoj mami. Uložení dat v počítači. Příklady kódování dat. IAJCE Přednáška č. 4

Funkcionální programování. Kristýna Kaslová

Lineární datové struktury

SPJA, cvičení 1. ipython, python, skripty. základy syntaxe: základní datové typy, řetězce. podmínky: if-elif-else, vyhodnocení logických výrazů

Úvod do programovacích jazyků (Java)

Zápis programu v jazyce C#

Paměť počítače. alg2 1

Dynamické datové struktury I.

Abstraktní datové typy FRONTA

Stromy. Příklady. Rekurzivní datové struktury. Základní pojmy

Datové struktury. Obsah přednášky: Definice pojmů. Abstraktní datové typy a jejich implementace. Algoritmizace (Y36ALG), Šumperk - 12.

Konstruktory a destruktory

Základy algoritmizace. Hašování

Martin Milata, Pokud je alespoň jeden rozměr čokolády sudý (s výjimkou tabulky velikosti 1x2, která už je od

O datových typech a jejich kontrole

Jazyk C# (seminář 5)

Paradigmata programování 1

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

PREPROCESOR POKRAČOVÁNÍ

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Generické programování

- znakové konstanty v apostrofech, např. a, +, (znak mezera) - proměnná zabírá 1 byte, obsahuje kód příslušného znaku

Programování v C++ 1, 5. cvičení

PŘETĚŽOVÁNÍ OPERÁTORŮ

Implementace LL(1) překladů

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií

PARADIGMATA PROGRAMOVÁNÍ 2 PŘÍSLIBY A LÍNÉ VYHODNOCOVÁNÍ

Syntaktická analýza. Implementace LL(1) překladů. Šárka Vavrečková. Ústav informatiky, FPF SU Opava

Lineární datové struktury

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Spojová implementace lineárních datových struktur

Vytváření a použití knihoven tříd

Počítačové laboratoře bez tajemství aneb naučme se učit algoritmizaci a programování s využitím robotů CZ.1.07/1.3.12/

Algoritmizace a programování

SII - Informatika. 1. Atribut relace, jehož hodnota jednoznačně určuje prvek v jiné relaci, se nazývá:

Datové struktury. alg12 1

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Příklad : String txt1 = new String( Ahoj vsichni! ); //vytvoří instanci třídy String a přiřadí ji vnitřní hodnotu Ahoj vsichni!

Programování v C++ 2, 4. cvičení

OBJEKTOVÉ PROGRAMOVÁNÍ V C++ V PŘÍKLADECH 8 Proudová knihovna 8.1 Hierarchie proudů Standardně zavedené proudy

PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE DATUM VYTVOŘENÍ: KLÍČOVÁ AKTIVITA: 02 PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) HODINOVÁ DOTACE: 1

5 Přehled operátorů, příkazy, přetypování

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Datové struktury 1: Základní datové struktury

Jazyk C++ II. STL knihovna kontejnery část 1

PRG036 Technologie XML

Platforma Java. Petr Krajča. Katedra informatiky Univerzita Palackého v Olomouci. Petr Krajča (UP) KMI/PJA: Seminář V. 27. říjen, / 15

Programování v C++, 2. cvičení

Objekty a třídy. Procedurální a objektově orientované programování. V této kapitole se naučíte: Procedurální a objektově orientované programování

PB přednáška (26. října 2015)

Functional and Logic Programming Functional languages

ABSTRAKTNÍ DATOVÉ TYPY (ADT)

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

Základy jazyka C# Obsah přednášky. Architektura.NET Historie Vlastnosti jazyka C# Datové typy Příkazy Prostory jmen Třídy, rozhraní

Pascal. Katedra aplikované kybernetiky. Ing. Miroslav Vavroušek. Verze 7

Programování v Pythonu

Dynamicky vázané metody. Pozdní vazba, virtuální metody

Tematický celek Proměnné. Proměnné slouží k dočasnému uchovávání hodnot během provádění aplikace Deklarace proměnných

Programování v C++ 2, 7. cvičení

Předmluva k aktuálnímu vydání Úvod k prvnímu vydání z roku Typografické a syntaktické konvence... 20

Operátory, výrazy. Tomáš Pitner, upravil Marek Šabo

IB111 Programování a algoritmizace. Objektově orientované programování (OOP)

JAVA. Další jazyky kompilovatelné do Java byte-code

Seznamy a iterátory. Kolekce obecně. Rozhraní kolekce. Procházení kolekcí

IB015 Neimperativní programování. Organizace a motivace kurzu, programovací jazyk Haskell. Jiří Barnat

PODOBÁ SE JAZYKU C S NĚKTERÝMI OMEZENÍMI GLOBÁLNÍ PROMĚNNÉ. NSWI162: Sémantika programů 2

Datové struktury 2: Rozptylovací tabulky

Kolekce, cyklus foreach

Programování v Javě I. Leden 2008

8 Třídy, objekty, metody, předávání argumentů metod

Třídy. Instance. Pokud tento program spustíme, vypíše následující. car1 má barvu Red. car2 má barvu Red. car1 má barvu Blue.

7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd

Jazyk C++, některá rozšíření oproti C

Programování v C++ 1, 6. cvičení

Programování v C++ 3, 3. cvičení

Semestrální práce z předmětu. Jan Bařtipán / A03043 bartipan@studentes.zcu.cz

Databázové systémy. - SQL * definice dat * aktualizace * pohledy. Tomáš Skopal

PARADIGMATA PROGRAMOVÁNÍ 2A INTERPRET S VEDLEJŠÍMI EFEKTY A MAKRY

Univerzita Palackého v Olomouci Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 10.4.

Transkript:

Uživatelem definované typy Ing. Lumír Návrat katedra informatiky, A 1018 59 732 3252 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 1.0 2.0) (Point 4.0 5.0) = 5.0 data Point a = Point a a polymorfismus konstruktor Point :: a -> a -> Point a 2 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 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 data Dvojice a b = Dvojice a b type Dvojice a b = (a,b) izomorfní s uspořádanými n-ticemi isred :: Color -> Bool isred Red = True může nastat chyba: isred Blue =??? 3 4 1

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) 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) 5 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)] jsou ekvivalentní původním typům představují pouze zkratky 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 7 8 2

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 } 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 ) 9 10 Ř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 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] 11 12 3

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 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 14 Základní typové třídy Hierarchie tříd Eq a Eq a => Ord a Enum a Read a Show a (Eq a, Show a) => Num a (Num a) => Fractional a (Fractional a) => Floating a (==), (/=) (<), (<=), (>), (>=), min, max succ, pred readsprec showspres, show (+), (-), (*), negate, abs (/), recip pi, exp, log, sqrt, (**), 15 16 4

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 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 17 18 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 19 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 20 5

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 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á 21 22 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 23 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) 24 6

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) 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? 25 26 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 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 q@(qu xs) not (isemptyq q) = (head xs, Qu (tail xs)) otherwise = error remq 27 28 7

Implementace fronty 2 -- vkládáme na začátek, vybíráme z konce seznamu Implementace fronty 3 newtype Queue a = Qu [a] [a] addq x (Qu xs) = Qu (x:xs) remq q@(qu xs) not (isemptyq q) = (last xs, Qu (init xs)) otherwise = error remq emptyq = Qu [] [] isemptyq (Qu [] []) = True isemptyq _ = False addq x (Qu xs ys) = Qu xs (x:ys) složitost addq/remq konstantní na začátku seznamu lineární na konci seznamu remq (Qu (x:xs) ys) = (x, Qu xs ys) remq (Qu [] ys) = remq (Qu (reverse ys) []) remq (Qu [] []) = error remq 29 30 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 31 8