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

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

Programovací jazyk Haskell doc. Dr. Ing. Miroslav Beneš  katedra informatiky, A-1007  59 732 4213.

Podobné prezentace


Prezentace na téma: "Programovací jazyk Haskell doc. Dr. Ing. Miroslav Beneš  katedra informatiky, A-1007  59 732 4213."— Transkript prezentace:

1 Programovací jazyk Haskell doc. Dr. Ing. Miroslav Beneš  katedra informatiky, A-1007  59 732 4213

2 2ÚDPJ - Programovací jazyk Haskell Historie září 1991 – Gofer experimentální jazyk experimentální jazyk Mark P. Jones Mark P. Jones únor 1995 – Hugs Hugs98 téměř úplná implementace jazyka Haskell 98 téměř úplná implementace jazyka Haskell 98 některá rozšíření navíc některá rozšíření navíc

3 3ÚDPJ - Programovací jazyk Haskell Instalace + dokumentace Základní zdroje http://haskell.org http://haskell.org http://haskell.org popis jazyka a knihoven http://haskell.org/hugs http://haskell.org/hugs http://haskell.org/hugs instalace (Win / Unix) uživatelská příručka (je součástí instalace) Další součásti Scholl of Expression (SOE) Scholl of Expression (SOE) Hugs Graphics Library Hugs Graphics Library

4 4ÚDPJ - Programovací jazyk Haskell Použití Princip výpočtu: kalkulátor $ hugs Prelude> 2*(3+5) 16 Prelude> cos 0 1.0Prelude> Skript: definice uživatelských funkcí $ hugs priklad.hs

5 5ÚDPJ - Programovací jazyk Haskell Řídicí příkazy Editace souboru :edit [soubor.hs]:e Načtení skriptu :load [soubor.hs]:reload Ukončení :quit Nápověda:? Unix – nastavení editoru v souboru ~/.profile export HUGSFLAGS="-E\"vi +%d %s\" +t +s -u"

6 6ÚDPJ - Programovací jazyk Haskell Skript priklad.hs module Priklad where -- funkce, která vrací součet dvou čísel soucet x y = x + y priklad.lhs > module Priklad where Funkce, která vrací faktoriál čísla > f n = if n == 0 then 1 else n * f (n-1)

7 7ÚDPJ - Programovací jazyk Haskell Datové typy Základní datové typy 1::Int 1::Int ‘a’::Char ‘a’::Char True,False::Bool True,False::Bool 3.14::Float 3.14::Float Seznamy [a] prázdný seznam [] prázdný seznam [] neprázdný seznam (x:xs) neprázdný seznam (x:xs) 1:2:3:[] :: [Int] 1:2:3:[] :: [Int] [1,2,3] :: [Int] [1,2,3] :: [Int]

8 8ÚDPJ - Programovací jazyk Haskell Datové typy Uspořádané n-tice (a,b,c,...) (1,2) :: (Int,Int) (1,2) :: (Int,Int) (1,['a','b'])::(Int, [Char]) (1,['a','b'])::(Int, [Char]) () :: () () :: () Funkce a->b faktorial :: Int -> Int faktorial :: Int -> Int soucet :: Int -> Int -> Int soucet :: Int -> Int -> Int plus :: (Int, Int) -> Int plus :: (Int, Int) -> Int

9 9ÚDPJ - Programovací jazyk Haskell Datové typy Uživatelské datové typy data Barva = Cerna data Barva = Cerna | Bila | Bila data Tree a = Leaf a data Tree a = Leaf a | Node a (Tree a) (Tree a) | Node a (Tree a) (Tree a) type String = [Char] type String = [Char] type Tabulka a = [(String, a)] type Tabulka a = [(String, a)]

10 10ÚDPJ - Programovací jazyk Haskell Definice funkcí Rovnice a unifikace vzorů (pattern matching): f pat11 pat12... = rhs1 f pat11 pat12... = rhs1 f pat21 pat22... = rhs2 f pat21 pat22... = rhs2...... Vybere se první rovnice vyhovující parametrům Pokud se nenajde  chyba

11 11ÚDPJ - Programovací jazyk Haskell Vzory proměnná inc x = x + 1 inc x = x + 1konstanta not True = False not True = False not False = True not False = Trueseznam length [] = 0 length [] = 0 length (x:xs) = 1 + length xs length (x:xs) = 1 + length xs

12 12ÚDPJ - Programovací jazyk Haskell Vzory n-tice plus (x,y) = x+y plus (x,y) = x+y konstruktor uživatelského typu nl (Leaf _) = 1 nl (Leaf _) = 1 nl (Tree _ l r) = (nl l) + (nl r) nl (Tree _ l r) = (nl l) + (nl r) pojmenování části vzoru duphd p@(x:xs) = x:p duphd p@(x:xs) = x:p

13 13ÚDPJ - Programovací jazyk Haskell Vzory anonymní proměnná _ hd (x:_) = x hd (x:_) = x vzor typu n+k fact 0 = 1 fact 0 = 1 fact (n+1) = (n+1)*fact n fact (n+1) = (n+1)*fact n strážené rovnice fact n | n == 0 = 1 | otherwise = n * fact(n-1) fact n | n == 0 = 1 | otherwise = n * fact(n-1)

14 14ÚDPJ - Programovací jazyk Haskell Příklady Faktoriál fakt1 n = if n == 0 then 1 else n * fakt1 (n-1) fakt1 n = if n == 0 then 1 else n * fakt1 (n-1) fakt2 0 = 1 fakt2 n = n * fakt2 (n-1) fakt2 0 = 1 fakt2 n = n * fakt2 (n-1) fakt3 0 = 1 fakt3 (n+1) = (n+1) * fakt3 n fakt3 0 = 1 fakt3 (n+1) = (n+1) * fakt3 n fakt4 n | n == 0 = 1 | otherwise = n * fakt4 (n-1) fakt4 n | n == 0 = 1 | otherwise = n * fakt4 (n-1)

15 15ÚDPJ - Programovací jazyk Haskell Příklady Fibonacciho čísla fib :: Int -> Int fib 0 = 0 fib 1 = 1 fib (n+2) = fib n + fib (n+1) fib :: Int -> Int fib 0 = 0 fib 1 = 1 fib (n+2) = fib n + fib (n+1)

16 16ÚDPJ - Programovací jazyk Haskell Příklady Délka seznamu length [] = 0 length (x:xs) = 1 + length xs length [] = 0 length (x:xs) = 1 + length xs Poznámka: pozor na konflikt s předdefinovanými funkcemi! module Pokus where import Prelude hiding(length) length [] = 0 length (_:xs) = 1 + length xs module Pokus where import Prelude hiding(length) length [] = 0 length (_:xs) = 1 + length xs

17 17ÚDPJ - Programovací jazyk Haskell Lokální definice Konstrukce let... in f x y = let p = x + y q = x – y in p * q f x y = let p = x + y q = x – y in p * q Konstrukce where f x y = p * q where p = x + y q = x - y f x y = p * q where p = x + y q = x - y

18 18ÚDPJ - Programovací jazyk Haskell Částeční aplikace funkcí Curryho tvar funkce add :: Int -> Int -> Int add x y = x + y add :: Int -> Int -> Int add x y = x + y plus :: (Int, Int) -> Int plus (x,y) = x + y plus :: (Int, Int) -> Int plus (x,y) = x + y add = curry plus curry :: ? add = curry plus curry :: ? plus = uncurry add uncurry :: ? plus = uncurry add uncurry :: ? Řezy funkce inc x = 1 + x inc x = 1 + x inc x = add 1 x inc x = add 1 x inc = add 1 inc = add 1 inc = (+1) = (1+) inc = (+1) = (1+) add = (+) add = (+)

19 19ÚDPJ - Programovací jazyk Haskell Příklady Vytvoření seznamu druhých mocnin dm [] = [] dm (x:xs) = sq x : dm xs where sq x = x * x dm [] = [] dm (x:xs) = sq x : dm xs where sq x = x * x Seřazení seznamu (quicksort) qs [] = [] qs (x:xs) = let ls = filter ( =x) xs in qs ls ++ [x] ++ qs rs qs [] = [] qs (x:xs) = let ls = filter ( =x) xs in qs ls ++ [x] ++ qs rs

20 20ÚDPJ - Programovací jazyk Haskell Funkce pro seznamy Přístup k prvkům seznamu head [1,2,3] = 1 head [1,2,3] = 1 tail [1,2,3] = [2,3] tail [1,2,3] = [2,3] last [1,2,3] = 3 last [1,2,3] = 3 init [1,2,3] = [1,2] init [1,2,3] = [1,2] [1,2,3] !! 2 = 3 [1,2,3] !! 2 = 3 null [] = True null [] = True length [1,2,3] = 3 length [1,2,3] = 3

21 21ÚDPJ - Programovací jazyk Haskell Funkce pro seznamy Spojení seznamů [1,2,3] ++ [4,5] = [1,2,3,4,5] [1,2,3] ++ [4,5] = [1,2,3,4,5] [[1,2],[3],[4,5]] = [1,2,3,4,5] [[1,2],[3],[4,5]] = [1,2,3,4,5] zip [1,2] [3,4,5] = [(1,3),(2,4)] zip [1,2] [3,4,5] = [(1,3),(2,4)] zipWith (+) [1,2] [3,4] = [4,6] zipWith (+) [1,2] [3,4] = [4,6] Agregační funkce sum [1,2,3,4] = 10 sum [1,2,3,4] = 10 product [1,2,3,4] = 24 product [1,2,3,4] = 24 minimum [1,2,3,4] = 1 minimum [1,2,3,4] = 1 maximum [1,2,3,4] = 4 maximum [1,2,3,4] = 4

22 22ÚDPJ - Programovací jazyk Haskell Funkce pro seznamy Výběr části seznamu take 3 [1,2,3,4,5] = [1,2,3] take 3 [1,2,3,4,5] = [1,2,3] drop 3 [1,2,3] = [4,5] drop 3 [1,2,3] = [4,5] takeWhile (>0) [1,3,0,4] = [1,3] takeWhile (>0) [1,3,0,4] = [1,3] dropWhile (> 0) [1,3,0,4] = [0,4] dropWhile (> 0) [1,3,0,4] = [0,4] filter (>0) [1,3,0,2,-1] = [1,3,2] filter (>0) [1,3,0,2,-1] = [1,3,2] Transformace seznamu reverse [1,2,3,4] = [4,3,2,1] reverse [1,2,3,4] = [4,3,2,1] map (*2) [1,2,3] = [2,4,6] map (*2) [1,2,3] = [2,4,6]

23 23ÚDPJ - Programovací jazyk Haskell Úkol Pokuste se uvedené funkce pro seznamy implementovat co je triviální případ? co je triviální případ? length [] = 0 maximum [x] = x funkci umím udělat s kratším seznamem -> jak tuto hodnotu zkombinuji s prvním prvkem seznamu, abych dostal výsledek? funkci umím udělat s kratším seznamem -> jak tuto hodnotu zkombinuji s prvním prvkem seznamu, abych dostal výsledek? maximum (x:y:ys) | x > y = maximum (x:ys) | otherwise = maximum (y:ys) maximum (x:y:ys) | x > y = maximum (x:ys) | otherwise = maximum (y:ys)


Stáhnout ppt "Programovací jazyk Haskell doc. Dr. Ing. Miroslav Beneš  katedra informatiky, A-1007  59 732 4213."

Podobné prezentace


Reklamy Google