Programovac í jazyk Haskell
description
Transcript of Programovac í jazyk Haskell
ProgramovacProgramovací jazykí jazykHaskellHaskell
doc. Dr. Ing. doc. Dr. Ing. Miroslav BenešMiroslav Beneš
katedra informatiky, A-1007katedra informatiky, A-1007
59 732 59 732 42134213
22ÚDPJ - Programovací jazyk HaskellÚDPJ - Programovací jazyk Haskell
HistorieHistorie
zzáří 1991 – Goferáří 1991 – Gofer experimentální jazykexperimentální jazyk Mark P. JonesMark P. Jones
únor 1995 – Hugsúnor 1995 – Hugs
Hugs98Hugs98 téměř úplná implementace jazyka Haskell 98téměř úplná implementace jazyka Haskell 98 některá rozšíření navícněkterá rozšíření navíc
33ÚDPJ - Programovací jazyk HaskellÚDPJ - Programovací jazyk Haskell
Instalace + dokumentaceInstalace + dokumentace
Základní zdrojeZákladní zdroje http://haskell.orghttp://haskell.org
popis jazyka a knihovenpopis jazyka a knihoven http://haskell.org/hugshttp://haskell.org/hugs
instalace (Win / Unix)instalace (Win / Unix)
uživatelská příručka (je součástí instalace)uživatelská příručka (je součástí instalace)
Další součástiDalší součásti Scholl of Expression (SOE)Scholl of Expression (SOE) Hugs Graphics LibraryHugs Graphics Library
44ÚDPJ - Programovací jazyk HaskellÚDPJ - Programovací jazyk Haskell
PoužitíPoužití
Princip výpočtu: kalkulátorPrincip výpočtu: kalkulátor$ $ hugshugsPrelude> Prelude> 2*(3+5)2*(3+5)1616Prelude> Prelude> cos 0cos 01.01.0Prelude>Prelude>
Skript: definice Skript: definice uživatelských uživatelských funkcfunkcíí
$ $ hugs priklad.hshugs priklad.hs
55ÚDPJ - Programovací jazyk HaskellÚDPJ - Programovací jazyk Haskell
Řídicí příkazyŘídicí příkazy
Editace souboruEditace souboru:e:editdit [[soubor.hssoubor.hs]] :e:e
Načtení skriptuNačtení skriptu:l:loadoad [[soubor.hssoubor.hs]] :r:reloadeload
UkonUkončeníčení:q:quituit
NápovědaNápověda:?:?
Unix – nastavenUnix – nastavení editoru v souboruí editoru v souboru ~/.profile ~/.profileexport HUGSFLAGS="-E\"vi +%d %s\" +t +s -u"export HUGSFLAGS="-E\"vi +%d %s\" +t +s -u"
66ÚDPJ - Programovací jazyk HaskellÚDPJ - Programovací jazyk Haskell
SkriptSkript
priklad.hspriklad.hsmodule Priklad wheremodule Priklad where
-- funkce-- funkce, která, která vrací součet dvou číselvrací součet dvou čísel
soucet x ysoucet x y = x + y = x + y
priklad.lhspriklad.lhs> module Priklad where> module Priklad where
Funkce, kterFunkce, která vrací á vrací faktorifaktoriál číslaál čísla
> > ff nn = = if n if n == 0 then 1 else n * f (n-1)== 0 then 1 else n * f (n-1)
77ÚDPJ - Programovací jazyk HaskellÚDPJ - Programovací jazyk Haskell
DatovDatovéé typy typy
Základní datové typyZákladní datové typy 1::Int1::Int ‘‘a’::Chara’::Char True,False::Bool True,False::Bool 3.14::Float3.14::Float
Seznamy Seznamy [a][a] prázdný seznam prázdný seznam [][] neprázdný seznam neprázdný seznam (x:xs)(x:xs) 1:2:3:[]1:2:3:[] :: [Int] :: [Int] [1,2,3] :: [Int][1,2,3] :: [Int]
88ÚDPJ - Programovací jazyk HaskellÚDPJ - Programovací jazyk Haskell
DatovDatovéé typy typy
Uspořádané n-tice Uspořádané n-tice (a,b,c,...)(a,b,c,...) (1,2)(1,2) :::: (Int,Int) (Int,Int) (1,['a','b'])(1,['a','b'])::(Int, [Char])::(Int, [Char]) () :: ()() :: ()
FunkceFunkce a->ba->b faktorial :: Int -> Intfaktorial :: Int -> Int soucet :: Int -> Int -> Intsoucet :: Int -> Int -> Int plus :: (Int, Int) -> Intplus :: (Int, Int) -> Int
99ÚDPJ - Programovací jazyk HaskellÚDPJ - Programovací jazyk Haskell
DatovDatovéé typy typy
Uživatelské datové typyUživatelské datové typy data Barva = Cernadata Barva = Cerna
| Bila| Bila
data Tree a = Leaf adata 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)]
1010ÚDPJ - Programovací jazyk HaskellÚDPJ - Programovací jazyk Haskell
Definice funkcDefinice funkcíí
RovniceRovnice a a unifikace vzorůunifikace vzorů (pattern matching):(pattern matching): f pat11 pat12 ... = rhs1f pat11 pat12 ... = rhs1 f pat21 pat22 ... = rhs2f pat21 pat22 ... = rhs2 ......
Vybere se první rovnice vyhovující Vybere se první rovnice vyhovující parametrůmparametrům
Pokud se nenajde Pokud se nenajde chyba chyba
1111ÚDPJ - Programovací jazyk HaskellÚDPJ - Programovací jazyk Haskell
VzoryVzory
promproměnnáěnná incinc x x = x + 1= x + 1
konstantakonstanta not True = Falsenot True = False not False = Truenot False = True
seznamseznam length [] = 0length [] = 0 length (x:xs) = 1 + length xslength (x:xs) = 1 + length xs
1212ÚDPJ - Programovací jazyk HaskellÚDPJ - Programovací jazyk Haskell
VzoryVzory
n-ticen-tice plus (x,y) = x+yplus (x,y) = x+y
konstruktor uživatelského typukonstruktor uživatelského typu nnll ((LeafLeaf _) = 1 _) = 1 nl (Tree _ l r) = (nl l) + (nl r)nl (Tree _ l r) = (nl l) + (nl r)
pojmenování části vzorupojmenování části vzoru duphd p@(x:xs) = x:pduphd p@(x:xs) = x:p
1313ÚDPJ - Programovací jazyk HaskellÚDPJ - Programovací jazyk Haskell
VzoryVzory
anonymní proměnnáanonymní proměnná _ _ hd (x:_) = xhd (x:_) = x
vzor typu vzor typu n+kn+k fact 0 = 1fact 0 = 1 fact (n+1) = (n+1)*fact nfact (n+1) = (n+1)*fact n
strážené rovnicestrážené rovnice fact n | n == 0 = 1fact n | n == 0 = 1 | otherwise = n * fact(n-1) | otherwise = n * fact(n-1)
1414ÚDPJ - Programovací jazyk HaskellÚDPJ - Programovací jazyk Haskell
PPříkladyříklady
FaktoriálFaktoriál ffakt1 n = if n == 0 then 1 akt1 n = if n == 0 then 1 else n * fakt1 (n-1) else n * fakt1 (n-1)
fakt2 0 = 1fakt2 0 = 1fakt2 n = n * fakt2 (n-1)fakt2 n = n * fakt2 (n-1)
fakt3 0 = 1fakt3 0 = 1fakt3 (n+1) = (n+1) * fakt3 nfakt3 (n+1) = (n+1) * fakt3 n
fakt4 n | n == 0 = 1fakt4 n | n == 0 = 1 | otherwise = n * fakt4 (n-1) | otherwise = n * fakt4 (n-1)
1515ÚDPJ - Programovací jazyk HaskellÚDPJ - Programovací jazyk Haskell
PPříkladyříklady
Fibonacciho číslaFibonacciho čísla
fib :: Int -fib :: Int -> Int> Intfib 0 = 0fib 0 = 0fib 1 = 1 fib 1 = 1 fib (n+2) = fib n + fib (n+1) fib (n+2) = fib n + fib (n+1)
1616ÚDPJ - Programovací jazyk HaskellÚDPJ - Programovací jazyk Haskell
PPříkladyříklady
Délka seznamuDélka seznamu length length [] = 0[] = 0length (x:xs) = 1 + length xslength (x:xs) = 1 + length xs
PoznPoznámka: pozor na konflikt s předdefinovanými ámka: pozor na konflikt s předdefinovanými funkcemi!funkcemi! module Pokus wheremodule Pokus whereimport Prelude hidingimport Prelude hiding(length)(length)
length [] = 0length [] = 0length (_:xs) = 1 + length xslength (_:xs) = 1 + length xs
1717ÚDPJ - Programovací jazyk HaskellÚDPJ - Programovací jazyk Haskell
LokLokální definiceální definice
Konstrukce Konstrukce let ... inlet ... in f x y = let p = x + yf x y = let p = x + y q = x – y q = x – y in p * q in p * q
KonstrukceKonstrukce where where f x y = p * qf x y = p * q where p = x + y where p = x + y q = x - y q = x - y
1818ÚDPJ - Programovací jazyk HaskellÚDPJ - Programovací jazyk Haskell
Částeční aplikace funkcíČásteční aplikace funkcí
Curryho tvar funkceCurryho tvar funkce add :: Int -> Int -> Intadd :: Int -> Int -> Intadd x yadd x y = x + y = x + y
plus :: (Int, Int) -> Intplus :: (Int, Int) -> Intplus (x,y) = x + yplus (x,y) = x + y
add = curry plus curry :: ?add = curry plus curry :: ? plus = uncurry add uncurry :: ?plus = uncurry add uncurry :: ?Řezy funkceŘezy funkce incinc x = 1 + x x = 1 + x inc x = add 1 xinc x = add 1 x inc = add 1inc = add 1 inc = (+1) = (1+)inc = (+1) = (1+) add = (+)add = (+)
1919ÚDPJ - Programovací jazyk HaskellÚDPJ - Programovací jazyk Haskell
PPříkladyříklady
Vytvoření seznamu druhých mocninVytvoření seznamu druhých mocnin dm dm [] = [][] = []dm (x:xs) = sq x : dm xsdm (x:xs) = sq x : dm xs where sq x = x * x where sq x = x * x
SeSeřazení seznamu (quicksort)řazení seznamu (quicksort) qs [] = []qs [] = []qs (x:xs) = qs (x:xs) = let ls = filter (< let ls = filter (< x) xsx) xs rs = filter (>=x) xs rs = filter (>=x) xs in qs ls ++ [x] ++ qs rs in qs ls ++ [x] ++ qs rs
2020ÚDPJ - Programovací jazyk HaskellÚDPJ - Programovací jazyk Haskell
Funkce pro seznamyFunkce pro seznamy
PPřístup k prvkům seznamuřístup k prvkům seznamu head [1,2,3] = 1head [1,2,3] = 1 tail tail [1,2,3] = [2,3][1,2,3] = [2,3] last [1,2,3] = 3last [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 [] = Truenull [] = True length [1,2,3] = 3length [1,2,3] = 3
2121ÚDPJ - Programovací jazyk HaskellÚDPJ - Programovací jazyk Haskell
Funkce pro seznamyFunkce pro seznamy
SpojenSpojení seznamůí 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]
AgregaAgregační funkceční funkce sum sum [1,2,3,4] = 10[1,2,3,4] = 10 product [1,2,3,4] = 24product [1,2,3,4] = 24 minimum [1,2,3,4] = 1minimum [1,2,3,4] = 1 maximum [1,2,3,4] = 4maximum [1,2,3,4] = 4
2222ÚDPJ - Programovací jazyk HaskellÚDPJ - Programovací jazyk Haskell
Funkce pro seznamyFunkce pro seznamy
VVýběr části seznamuýběr části seznamu take take 3 [1,2,3,4,5] = [1,2,3]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 seznamuTransformace 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]
2323ÚDPJ - Programovací jazyk HaskellÚDPJ - Programovací jazyk Haskell
ÚkolÚkol
Pokuste se uvedené funkce pro seznamy Pokuste se uvedené funkce pro seznamy implementovatimplementovat co je triviální případ?co je triviální případ?
length length [] = 0 [] = 0
maximummaximum [x] = x[x] = x
funkci umfunkci umím udělat s kratším seznamem -ím udělat s kratším seznamem -> jak t> jak tuto uto hodnotu zkombinuji s prvním prvkem seznamu, abych hodnotu zkombinuji s prvním prvkem seznamu, abych dostal výsledek?dostal výsledek?
maximum (x:y:ys) | x > y = maximum (x:ys)maximum (x:y:ys) | x > y = maximum (x:ys) | otherwise = maximum (y:ys) | otherwise = maximum (y:ys)