Paradygmaty programowania Haskell Piotr Matyasik AGH-UST 2014 Piotr Matyasik (AGH-UST) Paradygmaty programowania 2014 1 / 47 Historia A History of Haskell: Being Lazy With Class Paul Hudak (Yale), John Hughes (Chalmers), Simon Peyton Jones (MS Research), Philip Wadler (Edinburgh) Can programming be liberated from the von Neumann style? 1978 John Backus (nagroda Turinga) J zyki funkcyjne Miranda, Lazy ML, Orwell, Al, Id (dataow), Clean, Ponder, Daisy (Lisp, ML, Scheme) Piotr Matyasik (AGH-UST) Paradygmaty programowania 2014 2 / 47
Dlaczego kolejny j zyk? W Javie mo»na napisa wszystko! bª dy wielko± kodu q s o r t 1 : : Ord a => [ a ] > [ a ] q s o r t 1 [ ] = [ ] q s o r t 1 ( p : x s ) = q s o r t 1 l e s s e r ++ [ p ] ++ q s o r t 1 g r e a t e r where l e s s e r = [ y y < xs, y < p ] g r e a t e r = [ y y < xs, y >= p ] Piotr Matyasik (AGH-UST) Paradygmaty programowania 2014 3 / 47 Haskell Haskell is lazy, Haskell is pure, Haskell has a (type) class. Piotr Matyasik (AGH-UST) Paradygmaty programowania 2014 4 / 47
Haskell w dziaªaniu ghci l e t a = min 5 [ ( a, b, c ) a< [ 1.. 1 0 0 ], b < [1..100], c < [1..100], c<a+b, a a+b b == c c ] (+) 2 2 (^) 3 3 Piotr Matyasik (AGH-UST) Paradygmaty programowania 2014 5 / 47 Typy Bool True, False && not and, or Piotr Matyasik (AGH-UST) Paradygmaty programowania 2014 6 / 47
Typy Int Integer Float Double Char Int - ograniczony (zale»y od architektury, zwykle 32 lub 64 bity ze znakiem) Integer - nieograniczony Float - zmiennoprzecinkowy pojedynczej precyzji Double - zmiennoprzecinkowy podwójnej precyzji Char - znak ('a') Piotr Matyasik (AGH-UST) Paradygmaty programowania 2014 7 / 47 Typy Porz dek Ordering, typ relacji,wyliczeniowy (f. compare) LT (less than - mniejszy ni») EQ (equal - równy) GT (greater than - wi kszy ni») Operatory == /= Piotr Matyasik (AGH-UST) Paradygmaty programowania 2014 8 / 47
Typy Listy listy musz skªada si z elementów tego samego typu [] - pusta lista [el 1, el 2, el 3,...] Piotr Matyasik (AGH-UST) Paradygmaty programowania 2014 9 / 47 Typy Listy enumeracje [el 1..el n ] enumeracje [el 1,..] enumeracje [el 1, el 2,.., el n ] ++ ª czenie list : konstrukcja listy!! indeksowanie.. zakres [1,2,3] == (:) 1 ((:) 2 ((:) 3 [])) (:) 0 [1,2,3] [5,3..( 1)] Piotr Matyasik (AGH-UST) Paradygmaty programowania 2014 10 / 47
Typy Listy Tekst head, tail, last, init [el 1, el 2, el 3,...] l r [ ] = [ ] l r x s = l a s t x s : l r ( i n i t x s ) Piotr Matyasik (AGH-UST) Paradygmaty programowania 2014 11 / 47 Typy Listy x S, p(x) [x x S, px] (pochodz cy z, wzi ty z) p - stra»nik [m ++ " i " ++ k m< ["Adam", "Wacek" ], k< ["Anka", " Marta " ] ] s t r = [ s++[c ] s < "" : s t r, c < [ ' a '.. ' z ' ] ] Piotr Matyasik (AGH-UST) Paradygmaty programowania 2014 12 / 47
Typy Krotka odpowiednik struktury mo»e zawiera ró»ne typy elementów fst, snd (a trzeci?) (1,2,3) ('a ',1,[]) (([1,2,3],' a '),( sadasdad,[]),([])) Piotr Matyasik (AGH-UST) Paradygmaty programowania 2014 13 / 47 Przerwa Rozrywka Piotr Matyasik (AGH-UST) Paradygmaty programowania 2014 14 / 47
Typy Jeszcze raz od pocz tku! nazwy zawsze zaczynaj si du» liter WSZYSTKO ma swój typ! ( : ) : : a > [ a ] > [ a ] head : : [ a ] > a t a i l : : [ a ] > [ a ] length : : [ a ] > I n t co to jest a? Piotr Matyasik (AGH-UST) Paradygmaty programowania 2014 15 / 47 Typy Klasy Ord - porz dek zupeªny Show - mo»liwe do wy±wietlenia jako napis Read - mo»liwe do stworzenia z napisu Enum - enumerowalne Bounded - ograniczone Num - liczbowy Eq - porównywalne Integral - caªkowite Floating - zmiennoprzecinkowe Piotr Matyasik (AGH-UST) Paradygmaty programowania 2014 16 / 47
Currying Funkcje maj tylko jeden argument take : : I n t > [ a ] > [ a ] z i p : : [ a ] > [ b ] > [ ( a, b ) ] f o l d l : : ( a > b > a ) > a > [ b ] > a map : : ( a > b ) > [ a ] > [ b ] take : : I n t > [ a ] > [ a ] z i p : : [ a ] > [ b ] > [ ( a, b ) ] f o l d l : : ( a > b > a ) > a > ( [ b ] > a ) map : : ( a > b ) > [ a ] > [ b ] Piotr Matyasik (AGH-UST) Paradygmaty programowania 2014 17 / 47 Funkcje Dopasowanie wzorca wzorce s dopasowywane od pierwszego do ostatniego (góra-dóª, lewo-prawo) tylko pierwszy pasuj cy jest wykonywany wzorce musz obejmowa caª domen Piotr Matyasik (AGH-UST) Paradygmaty programowania 2014 18 / 47
Funkcje Dopasowanie wzorca f a c 0 = 1 f a c n = n f a c ( n 1) 1 mmax [ ] = e r r o r " p u s t a l i s t a " 2 mmax [ x ] = x 3 mmax ( x : x s ) 4 x > mmax x s = x 5 otherwise = mmax x s Piotr Matyasik (AGH-UST) Paradygmaty programowania 2014 19 / 47 Funkcje Guards! Where? sqreq a b c d e l t a > 0 = [ x1, x2 ] d e l t a == 0 = [ x1 ] otherwise = [ ] where x1 = ( b s q d e l t a ) / ( 2 a ) x2 = ( b + s q d e l t a ) / ( 2 a ) s q d e l t a = s q r t d e l t a d e l t a = b b 4 a c Piotr Matyasik (AGH-UST) Paradygmaty programowania 2014 20 / 47
Funkcje let (me) in case sqreq ' a b c = l e t d e l t a = b b 4 a c s q d e l t a = s q r t d e l t a x1 = ( b s q d e l t a ) / ( 2 a ) x2 = ( b + s q d e l t a ) / ( 2 a ) i n case compare d e l t a 0 of GT > [ x1, x2 ] EQ > [ x1 ] LT > [ ] Piotr Matyasik (AGH-UST) Paradygmaty programowania 2014 21 / 47 Notacja Lambda Funkcja na szybko \ x y z > \ x > (\ y > (\ z >... ) ) f x y z =... f = \ x > (\ y > (\ z >... ) ) Piotr Matyasik (AGH-UST) Paradygmaty programowania 2014 22 / 47
Pointfreee Gdzie si podziaªy nazwy parametrów!? num_of_occ e l e l i s t = length ( f i l t e r (== e l e ) l i s t ) num_of_occ = ( length. ). f i l t e r. (==) η redukcja square ' ' x = (^2) x square ' ' ' = (^2) Piotr Matyasik (AGH-UST) Paradygmaty programowania 2014 23 / 47 dolar i spacja f g h x (((f g)h)x) f g $ h x f g (h x) (f g)(h x) f $ g h x f(g h x) f((g h)x) f $ g $h x f(g(h x)) (f.g)x f(g x) (f.g.h)x f(g(h x)) Piotr Matyasik (AGH-UST) Paradygmaty programowania 2014 24 / 47
Typy danych Deniowanie typów wyliczeniowych data Mob = Chicken Cow Horse Pig Sheep V i l l a g e r S k e l e t o n C r e e p e r Zombie d e r i v i n g (Show, Eq) Piotr Matyasik (AGH-UST) Paradygmaty programowania 2014 25 / 47 Typy danych Deniowanie i s H o s t i l e : : Mob > Bool i s H o s t i l e Zombie = True i s H o s t i l e S k e l e t o n = True i s H o s t i l e C r e e p e r = True i s H o s t i l e _ = False Piotr Matyasik (AGH-UST) Paradygmaty programowania 2014 26 / 47
Typy danych Deniowanie typów z parametrami data M i n e c r a f t F i g u r e = P l a y e r String Mob String d e r i v i n g Show Piotr Matyasik (AGH-UST) Paradygmaty programowania 2014 27 / 47 Typy danych Deniowanie type I d = String data M i n e c r a f t F i g u r e = P l a y e r I d Mob I d d e r i v i n g Show Piotr Matyasik (AGH-UST) Paradygmaty programowania 2014 28 / 47
Typy danych Deniowanie data Person = Person String String I n t d e r i v i n g Show type A d d r e s s = String type Name = String type Age = I n t data Person = Person Name A d d r e s s Age Piotr Matyasik (AGH-UST) Paradygmaty programowania 2014 29 / 47 Typy danych Deniowanie data MTree a = N u l l Node a ( MTree a ) ( MTree a ) d e r i v i n g (Show, Eq, Ord) data XTree a = L e a f a Branch ( XTree a ) ( XTree a ) d e r i v i n g (Eq, Ord, Show) Piotr Matyasik (AGH-UST) Paradygmaty programowania 2014 30 / 47
Typy danych Sprytny konstruktor jak zapobiec nadawaniu bezsensownych warto±ci? data B a t e r i a p = B a t e r i a p d e r i v i n g (Show, Eq, Ord) type Poj = I n t data B a t e r i a p = B a t e r i a Poj d e r i v i n g (Show, Eq, Ord) B a t e r i a ( 10)????? Funkcja konstruuj ca makebatt p p>= 0 && p<100000 = B a t e r i a p o t h e r w i s e = e r r o r " N i e w l a s c i w a pojemnosc " Piotr Matyasik (AGH-UST) Paradygmaty programowania 2014 31 / 47 Typy danych instancja Show i n s t a n c e Show ( B a t e r i a a ) where show ( B a t e r i a p ) p>1000 = " B a t e r i a o p o j e m n o s c i " ++ ( show $ ( f r o m I n t e g r a l p ) / 1 0 0 0. 0 ) ++ "Ah" o t h e r w i s e = " B a t e r i a o p o j e m n o s c i " ++ ( show p ) ++ "mah" Piotr Matyasik (AGH-UST) Paradygmaty programowania 2014 32 / 47
Typy danych Notacja rekordowa data Punkt p = Punkt { x : : p, y : : p} d e r i v i n g (Show, Eq, Ord) x : : Punkt p > p y : : Punkt p > p Piotr Matyasik (AGH-UST) Paradygmaty programowania 2014 33 / 47 Kompozycja f :: a b f :: a (String, b) Jak poª czy funkcje typu f'? Piotr Matyasik (AGH-UST) Paradygmaty programowania 2014 34 / 47
Rozwi zanie s k l e j ( s, a ) f = ( s++w, q ) where (w, q ) = f a s k l e j ' ( s, a ) f = ( s ++ f s t ( f a ), snd ( f a ) ) n i c f = ( "", f ) l i f t f = n i c. f f x = 2 x f ' x = ( "mnoze " ++ ( show x ) ++ " p r z e z dwa", f x ) Piotr Matyasik (AGH-UST) Paradygmaty programowania 2014 35 / 47 Monada Denicja -koniec z udawaniem,»e nikt nie rozumie monad data Deb a = Deb String a d e r i v i n g (Show, Eq, Ord) instance Monad Deb where return f = Deb "" f (>>=) ( Deb s v ) f = Deb ( s++w) a where ( Deb w a ) = f v f x = Deb "Odpalam f " (2 x ) g x = Deb "Odpalam g" (2+x ) Piotr Matyasik (AGH-UST) Paradygmaty programowania 2014 36 / 47
Monada Ale to w sumie takie niepraktyczne, jak to rozró»ni? data Deb a = Deb [ String ] a d e r i v i n g (Show, Eq,Ord) instance Monad Deb where return f = Deb [ "" ] f (>>=) ( Deb s v ) f = Deb ( s++w) a where ( Deb w a ) = f v f x = Deb [ "Odpalam f na " ++ show x ] (2 x ) g x = Deb [ " Odpalam g na " ++ show x ] (2+ x ) Piotr Matyasik (AGH-UST) Paradygmaty programowania 2014 37 / 47 Monada GENIALNE!! - dziwne,»e nikt na to nie wpadª wcze±niej import Control.Monad.Writer Piotr Matyasik (AGH-UST) Paradygmaty programowania 2014 38 / 47
Monada jako pojemnik return :: (Monad m) a m a - zapakuj zwykªy element fmap :: (F unctor f) (a b) f a f b - zmie«pudeªko a na pudeªko b join :: (Monad m) m (m a) m a - przepakuj w jedno pudeªko (>>=) :: (Monad m) m a (a m b) m b - bind (posuwaj) xs >>= f = join (fmap f xs) i n s t a n c e Monad [ ] where r e t u r n x = [ x ] x s >>= f = c o n c a t (map f x s ) Piotr Matyasik (AGH-UST) Paradygmaty programowania 2014 39 / 47 Monada jako proces obliczeniowy M a - proces obliczeniowy daj cy w wyniku a return :: (Monad m) a m a - proces obliczeniowy, który nic nie robi (>>) :: (Monad m) m a m b m b - dwa procesy obliczeniowe a i b, uruchamiany jest proces a, pomija si jego wynik, a nast pnie uruchamiany jest proces b, który zwraca wynik (>>=) :: (Monad m) m a (a m b) m b - proces obliczeniowy a i funkcja, która na podstawie wyników pierwszego procesu obliczeniowego okre±la kolejny proces obliczeniowy Piotr Matyasik (AGH-UST) Paradygmaty programowania 2014 40 / 47
do notacja do do { x } = x do { x ; <stms> } = x >> do { <stms> } do { v < x ; <stms> } = x >>= \ v > do { <stms> } do { l e t <decs> ; <stms> } = l e t <decs> i n do { <stms> } Piotr Matyasik (AGH-UST) Paradygmaty programowania 2014 41 / 47 Monada Prawa - nr 1 return v >>= f == f v do w < return v f w = do f v Piotr Matyasik (AGH-UST) Paradygmaty programowania 2014 42 / 47
Monada Prawa - nr 2 x >>= return == x do = do v < x return x v Piotr Matyasik (AGH-UST) Paradygmaty programowania 2014 43 / 47 Monada Prawa - nr 3 ( x >>= f ) >>= g == x >>= (\ v > f v >>= g ) do w < do g w = do v < x w < f g w v v < x f v Piotr Matyasik (AGH-UST) Paradygmaty programowania 2014 44 / 47
Monada Prawa s k l e j ' ( s, a ) f = ( s ++ f s t ( f a ), snd ( f a ) ) s k l e j ' x f = ( f s t x ++ f s t ( f ( snd x ) ), snd ( f ( snd x ) ) ) n i c f = ( " p a k u j e f ", f ) return v >>= f == f v x >>= return == x ( x >>= f ) >>= g == x >>= (\ v > f v >>= g ) Piotr Matyasik (AGH-UST) Paradygmaty programowania 2014 45 / 47 Funktor Funktor Funktor to odwzorowanie jednej kategorii w drug zachowuj ce zªo»enia i morzmy to»samo±ciowe. c l a s s Functor f where fmap : : ( a > b ) > f a > f b Piotr Matyasik (AGH-UST) Paradygmaty programowania 2014 46 / 47
Control.Monad Po co to wzystko - odpowied¹? mapm :: Monad m (a m b) [a] m [b] sequence :: Monad m [m a] m [a] (=<<) :: Monad m (a m b) m a m b (>=>) :: Monad m (a m b) (b m c) a m c (<=<) :: Monad m (b m c) (a m b) a m c Piotr Matyasik (AGH-UST) Paradygmaty programowania 2014 47 / 47