Programovac í jazyk Haskell

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

description

Programovac í jazyk Haskell. doc. Dr. Ing. Miroslav Beneš  katedra informatiky, A-1007  59 732 4213. Historie. z áří 1991 – Gofer experimentální jazyk Mark P. Jones únor 1995 – Hugs Hugs98 téměř úplná implementace jazyka Haskell 98 některá rozšíření navíc. - PowerPoint PPT Presentation

Transcript of Programovac í jazyk Haskell

Page 1: 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

Page 2: Programovac í jazyk Haskell

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

Page 3: Programovac í jazyk Haskell

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

Page 4: Programovac í jazyk Haskell

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

Page 5: Programovac í jazyk Haskell

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"

Page 6: Programovac í jazyk Haskell

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)

Page 7: Programovac í jazyk Haskell

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]

Page 8: Programovac í jazyk Haskell

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

Page 9: Programovac í jazyk Haskell

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)]

Page 10: Programovac í jazyk Haskell

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

Page 11: Programovac í jazyk Haskell

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

Page 12: Programovac í jazyk Haskell

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

Page 13: Programovac í jazyk Haskell

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)

Page 14: Programovac í jazyk Haskell

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)

Page 15: Programovac í jazyk Haskell

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)

Page 16: Programovac í jazyk Haskell

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

Page 17: Programovac í jazyk Haskell

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

Page 18: Programovac í jazyk Haskell

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 = (+)

Page 19: Programovac í jazyk Haskell

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

Page 20: Programovac í jazyk Haskell

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

Page 21: Programovac í jazyk Haskell

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

Page 22: Programovac í jazyk Haskell

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]

Page 23: Programovac í jazyk Haskell

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)