Programovac jazyk Haskell Ing Lumr Nvrat katedra informatiky

  • Slides: 23
Download presentation
Programovací jazyk Haskell Ing. Lumír Návrat katedra informatiky, A 1018 59 732 3252 FLP

Programovací jazyk Haskell Ing. Lumír Návrat katedra informatiky, A 1018 59 732 3252 FLP - Programovací jazyk Haskell

Historie l září 1991 – Gofer l l experimentální jazyk Mark P. Jones únor

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

Instalace + dokumentace l Základní zdroje l http: //haskell. org l l http: //haskell.

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

Použití l Princip výpočtu: kalkulátor $ hugs Prelude> 2*(3+5) 16 Prelude> cos 0 1.

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

Řídicí příkazy l Editace souboru : edit [soubor. hs] l Načtení skriptu : load

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

Skript l priklad. hs module Priklad where -- funkce, která vrací součet dvou čísel

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

Datové typy l Základní datové typy l l l 1: : Int ‘a’: :

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

Datové typy l Uspořádané n-tice (a, b, c, . . . ) l l

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

Datové typy l Uživatelské datové typy l data Barva = Cerna | Bila l

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

Definice funkcí l Rovnice a unifikace vzorů (pattern matching): l l l f pat

Definice funkcí l Rovnice a unifikace vzorů (pattern matching): l l l f pat 11 f pat 21. . . pat 12 pat 22 . . . = rhs 1 = rhs 2 l Vybere se první rovnice vyhovující parametrům l Pokud se nenajde chyba FLP - Programovací jazyk Haskell 10

Vzory l proměnná l l konstanta l l l inc x = x +

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

Vzory l n-tice l l konstruktor uživatelského typu l l l plus (x, y)

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

Vzory l anonymní proměnná _ l l vzor typu n+k l l l hd

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

Příklady l Faktoriál l fakt 1 n = if n == 0 then 1

Příklady l Faktoriál l fakt 1 n = if n == 0 then 1 else n * fakt 1 (n-1) l fakt 2 0 fakt 2 n = 1 = n * fakt 2 (n-1) l fakt 3 0 = 1 fakt 3 (n+1) = (n+1) * fakt 3 n l fakt 4 n | n == 0 = 1 | otherwise = n * fakt 4 (n-1) FLP - Programovací jazyk Haskell 14

Příklady l Fibonacciho čísla l fib fib : : Int -> Int 0 =

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

Příklady l Délka seznamu l l length [] = 0 length (x: xs) =

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

Lokální definice l Konstrukce let. . . in l l f x y =

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

Částeční aplikace funkcí l Curryho tvar funkce l l l add : : Int

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

Příklady l Vytvoření seznamu druhých mocnin l l dm [] = [] dm (x:

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

Funkce pro seznamy l Přístup k prvkům seznamu l l l l head [1,

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

Funkce pro seznamy l Spojení seznamů l l l [1, 2, 3] ++ [4,

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

Funkce pro seznamy l Výběr části seznamu l l l take 3 [1, 2,

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

Úkol l Pokuste se uvedené funkce pro seznamy implementovat l co je triviální případ?

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