Warning
This page is located in archive.

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]) ++ [x] ++ (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"

courses/a4b33flp/2015/haskell.txt · Last modified: 2016/03/01 02:10 by vyskoji1