====== Haskell přednáška 6 ======
typy, definice funkcí, pattern matching, seznamy, základní vestavěné funkce a operátory: :load, :type (:t), %%(++), (:), (==)%%, fraenklovy termy pro seznamy
-- tři ekvivalentní definice funkce faktoriál:
faktorial :: Integer -> Integer -- explicitní typová definice
faktorial n = if n==0 then 1 else n*(faktorial (n-1))
faktorial1 0 = 1
faktorial1 n = n*(faktorial1 (n-1))
faktorial'' n | n==0 = 1
| otherwise = n*(faktorial'' (n-1))
car (e : _) = e -- příklad možné implementace car ze Scheme
cdr (_ : ls) = ls -- příklad možné implementace car ze Scheme
cons e ls = (e : ls) -- příklad možné implementace car ze Scheme
head'' (x:_) = x -- vestavěná fce head odpovídá car ve Scheme
tail'' (_:xs) = xs -- vestavěná fce tail odpovídá cdr ve Scheme
[1..100] -- seznam čísel od 1 do 100 včetně
[1,3..100] -- seznam lichých čísel od 1 do 100 včetně
[2,4..100] -- seznam sudých čísel od 1 do 100 včetně
[1..] -- seznam všech čísel od 1
[1,3..] -- seznam všech lichých čísel od 1
-- implementace algoritmu QuickSort v Haskellu:
quicksort [] = []
quicksort (x:xs) = (quicksort [e|e<-xs,e=x])
====== Haskell přednáška 7 ======
lambda termy, curryfikace, grafická syntaxe, @, let, where, typové třídy (class, instance, deriving), základní typové třídy (Eq, Ord, Num, Show)
--Příklad lambda termu
Main> map (\ x -> -x) [1..10]
[-1,-2,-3,-4,-5,-6,-7,-8,-9,-10]
--Příklad curryfikace funkce -
Main> map ((-) 0) [1..10]
[-1,-2,-3,-4,-5,-6,-7,-8,-9,-10]
--Příklad curryfikace infixové funkce -
Main> map (0-) [1..10]
[-1,-2,-3,-4,-5,-6,-7,-8,-9,-10]
--Příklad let konstrukce
Main> let minus = (0-) in map minus [1..10]
[-1,-2,-3,-4,-5,-6,-7,-8,-9,-10]
--Příklad let konstrukce
Main> let {minus = (0-); seznam = [1..10]} in map minus seznam
[-1,-2,-3,-4,-5,-6,-7,-8,-9,-10]
--Příklad where konstrukce
Main> map minus seznam where {minus = (0-); seznam = [1..10]}
[-1,-2,-3,-4,-5,-6,-7,-8,-9,-10]
msort [] = []
msort [x] = [x]
msort ls = merge sas sbs where
(las,lbs) = split ls where
split [] = ([],[])
split [x] = ([x],[])
split (x:y:ls) = (x:xs,y:ys) where
(xs,ys) = split ls
sas = msort las
sbs = msort lbs
merge [] ls = ls
merge ls [] = ls
merge zs@(x:xs) qs@(y:ys) | (x <= y) = (x : merge xs qs)
| otherwise = merge qs zs
data Barvy = Modra | Zelena | Cervena | Zluta | Bila
-- namísto následující konstrukce SeznamBarev pro seznam barev:
data SeznamBarev = Cons Barvy SeznamBarev | Prazdny
-- raději použijeme parametrický typ:
data Seznam a = Cons a (Seznam a) | Prazdny
-- vestavěné seznamy: data [a] = a : [a] | []
data Barvy = Modra | Zelena | Cervena deriving (Eq,Ord)
instance Show Barvy where
show Modra = "BLUE"
show Zelena = "GREEN"
show Cervena = "RED"
data Strom a = Uzel a [Strom a] | Listek a deriving Show
class W a where
w :: a -> Bool
instance W Barvy where
w Modra = True
w Cervena = False
w _ = error "Chyba"