Upload
lamanh
View
242
Download
3
Embed Size (px)
Citation preview
Funkcionalno programiranjespecijalno izdanje, akademska godina 2016/17
Matematicki fakultet
Ivan Cukic
[email protected]://poincare.math.rs/-ivan
UVOD
Funkcionalno programiranje
Sta je funkcionalno programiranje?
3
Osobine FP jezika
funkcije viseg reda
cistocalenjoststroga tipiziranost
Ako uzmemo sve ovo kao preduslov da jezik bude funkcionalan,vecina jezika ce otpasti.
4
Jezici
Lisp – prvi funkcionalni jezikHaskell – danasnji sinonim za FPScala – mesavina OO i FP paradigmiErlang – jezik za distribuirane sistemeElm – jezik za pisanje veb aplikacijaC++ – najpopularniji funkcionalni jezik :)
5
SADRZAJ KURSA
Uvod: Haskell
lenjostkarijevanje i parcijalna aplikacijafunkcije viseg redamap, filter, foldpattern matching. . .
7
C++
Razlike izmedju normalnih FP jezika i C++-aIntervali, transformacije intervalaMonade, optional/maybe, . . .Primena monada u parsiranju, . . .Dizajn softvera kroz reaktivne tokove
8
Obaveze tokom godine
Jos uvek nije nista precizirano – dok se ne vidi koliko ce bitiprijavljenih studenata.
Projekat, kolokvijum, ispit?
9
SCALA
Java
Nastala sa idejom da bude jednostavnaEkosistem se razvijao, platforma i bibliotekeJezik je vecinom stagnirao, ili je prosirivan na cudne nacine
11
Scala i Java
Rade na JVMScala moze da poziva metode iz Java, vecinom i obratnoSkala je ekspresivniji jezik, sa (vecinom) dobrimpodrazumevanim ponasanjemSkala nema staticke metode i promenljive
12
Kompilacija Scala programa
scalac program.scala # pravi .class fajl, kao javac
scala # pokrece Scala REPLscala program.scala # pokrece programscala Program # pokrece program, kao java
sbt compile # kompajlira projekatsbt run # pokrece projekat
13
Scala kao jezik
Syntactic sugarPametni tipovi umesto primitivnihStriktni tipoviPomoc i u imperativnom programiranju (foreach,try-with-resource, exceptionless)
14
Lose strane
Prebrza evolucijaNedovoljna kompatibilnost unazad
15
Kursevi
Functional Programming Principles in Scala
Functional Program Design in Scala
16
CAS 1: HASKELL – OSNOVE, TIPOVIPODATAKA
Implementacije Haskella
Postoje mnoge implementacije jezika Haskell:
GHC – Glasgow Haskell CompilerUHC – Ultrecht Haskell CompilerLHC – LLVM Haskell Compiler. . .Hugs
18
Ekstenzije jezika
Prirodna evolucija jezika – kompajleri implementiraju ekstenzijekoje ako se pokazu korisnim mogu kasnije da postanu deosamog jezika.
Neke od interesantnih ekstenzija
OverloadedStringsLambdaCase. . .
19
Kompilacija Haskell programa
ghc program.hs # kompajlira program,# fajl mora da ima main funkciju
Flegovi:
-Wall # upozorenja na potencijalne greske-Werror # sva upozorenja postaju greske
--make # kompajlira projekat sa vise modula
-o # izlazni fajl
-XEkstenzija # ukljucuje ekstenziju jezika
20
REPL – read–eval–print loop
ghci # pokrece haskell REPLghci program.hs # pokrece REPL i ucitava funkcije
# iz datog fajla
:module Modul # ucitava modul (biblioteku f-ja)
:set +t # za svaki rezultat ispisuje i tip:set +m # viselinijske definicije
:set -XEkstenzija # ukljucuje navedenu ekstenziju
Podesavanja se nalaze u ~/.ghci
21
Cabal – sistem za kompilaciju projekata
cabal sandbox init # inicijalizuje "igraliste"cabal ini # pravi haskell projekatcabal configure # priprema projekat za kompilacijucabal build # kompajlira projekat
Alternativa: stack
22
Liste
[] -- prazna lista(x: xs) -- definisanje liste
-- x je glava, xs je 'rep'
[ 1, 2, 3 ] -- sintaksa za 1 : 2 : 3 : [][ True, False ] -- lista logickih vrednosti
23
Liste brojeva
[ 1 .. 5 ] -- [ 1, 2, 3, 4, 5 ][ 1, 3 .. 10 ] -- [ 1, 3, 5, 7, 9 ][ 5, 4 .. 1 ] -- [ 5, 4, 3, 2, 1 ][ 1 .. ] -- beskonacna lista
24
Stringovi
data String = [Char]
"Fun" -- [ 'F', 'u', 'n' ]'f' : "un" -- "Fun""f" ++ "un" -- "Fun"
U ozbiljnijim projektima, koristiti Data.Text iliData.ByteString tipove uz -XOverloadedStringsekstenziju jezika.
25
Ciklicna lista
Implementirati funkcije za baratanje ciklicnom listom:
insert – dodaje element kao trenutniswap – zamenjuje trenutni element sledecimremove – uklanja trenutni elementtoNext – pomera glavu na sledeci elementtoPrev – pomera glavu na prethodni element
26
Ciklicna lista – pokusaj 1
Koristimo [Int] da reprezentujemo listu
insert :: Int -> [Int] -> [Int]insert value list = (???)
27
Ciklicna lista – pokusaj 1
swap :: [Int] -> [Int]swap = (???)
28
Ciklicna lista – pokusaj 1
swap :: [Int] -> [Int]swap [] = []swap [x] = [x] -- sta ako uklonimo ovaj red?swap (x1:x2:xs) = x2:x1:xs
29
Ciklicna lista – pokusaj 1
swap :: [Int] -> [Int]swap (x1:x2:xs) = x2:x1:xsswap xs = xs
30
Ciklicna lista – pokusaj 1
swap :: [Int] -> [Int]swap xs = case xs of
[] -> [][x] -> [x](x1:x2:xs) -> x2:x1:xs
31
Tipovi
Sta su tipovi sledecih vrednosti?
[True, False][1, 2, 3][]
32
Korisnicki tipovi
Ako zelimo da imenujemo neki postojeci tip, koristimo typekljucnu rec:
-- Imena tipova pocinju velikim slovomtype Ring = [Int]
insert :: Int -> Ring -> Ringswap :: Ring -> Ring
Na ovaj nacin krijemo internu implementaciju od korisnika nasebiblioteke.
33
Genericki tipovi
Do sada smo imali samo ciklicne liste celih brojeva.
Sta ako zelimo da dozvolimo korisniku da pravi ciklicne listeproizvoljnog tipa? (kao sto bi u C++-u i Javi bio Ring<T>)
-- Tipske promenljive pocinju malim slovomtype Ring t = [t]
insert :: t -> Ring t -> Ring tswap :: Ring t -> Ring t
34
Rotiramo listu
type Ring t = [t]
focusNext :: Ring t -> Ring tfocusNext = (???)
35
Operacije kontrukcije i konkatenacije
:t (:):t (++)
36
Implementacija konkatenacije
(++) :: [a] -> [a] -> [a][] ++ ys = ys(x:xs) ++ ys = x : (xs ++ ys)
Rekli smo da ne zelimo vise da vidimo rekurziju. Kako ovoimplementirati koristeci fold?
37
Rotiramo listu na drugu stranu
type Ring t = [t]
focusPrev :: Ring t -> Ring tfocusPrev = (???)
38
Rotiramo listu na drugu stranu
type Ring t = [t]
focusPrev :: Ring t -> Ring tfocusPrev ts = reverse (focusNext (reverse ts))
Nije efikasno, ali je dobro za razmisljanje.
39
Kompozicija funkcija
(.) :: (b->c) -> (a->b) -> (a->c)(f . g) x = f (g x)
Alternativno, preko lambda funkcije.
40
Operator aplikacije funkcije
($) :: (a -> b) -> a -> bf $ x = f x
41
Efikasnost operacija nad listama
Liste u Haskelu su jednostruko povezane – glava i rep – takoda pate od svih problema koje imaju liste u drugim jezicima.
Alternativne strukture podataka: Data.Sequence,Data.Vector.
42
Efikasnost operacija nad listama
Brze operacije:
(:) -- O(1)head -- O(1)tail -- O(1)
Sporije operacije:
xs !! n -- O(n)take n, drop n, splitAt n -- O(n)xs ++ yz -- O(length xs)
43
Osnovne operacije sa listama
null -- da li je lista prazna?head last -- prvi, odnosno poslednji elementtail init -- svi osim prvog, odnosno poslednjeg
length "Hello world" -- 11reverse "Hello world" -- "dlrow olleH""Hello world" !! 4 -- 'o'
44
Primeri
Ekstraktovanje prve reci iz receniceEkstraktovanje prve dve reci iz receniceObrnuta varijanta mapiranja
45
CAS 2: HASKELL – OSNOVNEFUNKCIJE, TESTIRANJE, KLASE
TIPOVA
zip
-- zip :: [a] -> [b] -> [(a, b)]zip "Hello" "World"
Primeri:
-- Indeksiranje elemenata listewithIndex = zip [0..]
-- Racunanje parovapairs xs = zip xs $ tail xs
-- Provera da li je lista sortiranaisSorted xs = and [ x <= y | (x, y) <- pairs xs ]
47
zipWith
-- zipWith :: (a -> b -> c) -> [a] -> [b] -> [c]zipWith (+) [1..5] [5..]
48
map
map :: (a -> b) -> [a] -> [b]
map length $ words "The silent old pond a mirror of ancient calm, a frog-leaps-in splash."let ws = words "The silent old pond a mirror of ancient calm, a frog-leaps-in splash."
in zip ws $ map length ws
49
filter
filter :: (a -> Bool) -> [a] -> [a]
let ws = words "The silent old pond a mirror of ancient calm, a frog-leaps-in splash."in filter ((>5) . snd) (zip ws $ map length ws)
50
Fold
foldlfoldl1foldrfoldr1
51
Fold - primer
and :: [Bool] -> Boolconcat :: [[a]] -> [a]all :: (a -> Bool) -> [a] -> Boolany :: (a -> Bool) -> [a] -> Boollength :: [a] -> Int
(!!) :: [a] -> Int -> atakeWhile :: (a -> Bool) -> [a] -> [a]
map :: (a -> b) -> [a] -> [b]filter :: (a -> Bool) -> [a] -> [a]
52
Karijevanje
addNumbers (a, b, c) = a + b + c
addNumbers a b c = a + b + c
addNumbers = \ a ->\ b ->
\ c -> a + b + c
53
Polimorfne funkcije
head :: [a] -> a
indexOf :: Eq a => a -> [a] -> Int
isSorted :: Ord a => [a] -> Bool
54
Sintaksa operatora
(+) 1 2
10 mod 3
(1.0/) 4.0(/2.0) 4.0
55
Generatori lista (List comprehension)
Lista svih neparnih brojeva od 1 do 42
[ x | x <- [1..42], odd x ]
56
Testiranje cistih funkcija
Ciste funkcije su lake za testiranje – jedino sto treba dauradimo je da konstruisemo argumente koje moramo daprosledimo funkciji.
U OOP stilu programiranja, moramo da simuliramo svepotrebne delove spoljasnjeg stanja.
57
Testiranje fiksnih tacaka
prop_swap s = s == swap (swap s)
import Test.QuickCheckquickCheck prop_swap
58
Korisnicki tipovi
Do sada smo videli kako se prave aliasi postojecih tipova:
type Ring = [Int]
I videli smo sta su liste, n-torke (n-tuple).
Ali, sta kad nam je potrebno nesto naprednije?
59
Korisnicki tipovi – nastavak
data Bool = False | True
data Ring = MakeRing [t] [t]
data Maybe t = Nothing | Just t
60
Korisnicki tipovi – nastavak
Konsturktori mogu da se koriste kao funkcije da napravevrednost odredjenog tipa, ali i da dekonstruisu vrednost zapattern matching:
data Bool = False | True
toString True = "True"toString False = "False"
data Ring = MakeRing [t] [t]
ringSum (MakeRing ls rs) = sum ls + sum rs
Napomena: Konstruktori mogu da budu i operatori, ali u tomslucaju moraju da pocnu dvotackom.
61
Korisnicki tipovi – enkapsulacija
Ako sakrijemo konstruktore, krijemo “internu implementaciju”nase strukture.
module Ring(Ring, ringSum) where
62
Primer lepse implementacije Ring tipa
data Ring = MakeRing [t] [t]
(videti primer sa casa)
63
Klase tipova (type classes)
Zelimo da uklonimo vrednost iz liste
remove :: Ring t -> t -> Ring t
Da li mozemo ovo da implementiramo za bilo kakvo t?Da li mozemo da implementiramo sortiranje liste bilo kakviht-ova?
64
Klase tipova (type classes)
Da bismo poredili vrednost nekog t-a sa datim, tip t mora daima implementiran operator ==:
remove :: Eq t => Ring t -> t -> Ring t
Da bismo mogli da sortiramo listu, elementi liste moraju daimaju implementirano poredjenje:
sort :: Ord t => [t] -> [t]
65
Klase tipova (type classes)
Kako se definisu klase tipova?
class Num a where(+) :: a -> a -> a(*) :: a -> a -> aneg :: a -> a-- ...
Kad zelimo da kazemo da nas tip pripada ovoj klasi, mozemo dadefinisemo ove funkcije:
instance Num Int wherea + b = -- implementiramo sabiranjea * b = -- ...neg a = -- ...-- ...
66
Kako rade klase tipova? (konceptualno)
Kad napisemo nesto ovako:
square :: Num n => n -> nsquare x = x * x
Kompajler interno generise nesto slicno sledecem:
square :: Num n -> n -> nsquare m x = (*) m x x
m je vrednost tipa Num n – i razlicita je za svako n. Ovo mozeda se gleda kao da je square mapa funkcija – mapira vrednostikoje predstavljaju identifikator tipa na funkcije koje pripadajutom tipu.
67
Kako rade klase tipova? (konceptualno)
class Num a where data Num a = MakeNum(+) :: a -> a -> a -> (a -> a -> a)neg :: a -> a (a -> a)
instance Num Int where dNumInt :: Num Inta + b = plus a b -> dNumInt = MakeNum plusneg a = negate a negate
68
Kako rade klase tipova? (konceptualno)
Pri pozivu funkcije, to izgleda ovako:
-- Num n -> n -> n -> n Num n -> n -> n -> nnegSum x y = -> negSum m x y =
neg $ x + y neg m $ (+) m x y
69
Razlika u odnosu na OOP
Funkcije nisu vezane za vrednostPostojeci tipovi mogu da postanu instance neke nove klaseZavistnost moze da bude i od povratnog tipafromInteger :: Num a => Integer -> aStaticki polimorfizam, nije nasledjivanje
70
CAS 3: HASKELL – KLASE TIPOVA, IO,TYPE KIND
Klase tipova (type classes)
Kako se definisu klase tipova?
class Eq a where(==) :: a -> a -> Bool(/=) :: a -> a -> Boolx == y = not (x /= y)x == y = not (x /= y)
72
Klase tipova (type classes)
Kako da kazemo da je nas tip Eq?
instance Eq t => Eq (Ring t) where(==) = ...
73
Genericke funkcije
Videli smo sta map radi za liste?Da li mozemo da je koristimo za nizove, Maybe a, . . .
map $ Just 2
74
Genericke funkcije
fmap ne radi samo nad listama, nego i na drugim tipovima.
class Functor f wherefmap :: (a -> b) -> f a -> f b
Uz pravila:
fmap id = idfmap (f . g) = (fmap f) . (fmap g)
75
Tipovi sa konverzijom u Bool
while (1) {// ...
}
Pogledati primer evil_bool
76
I/O – problem komunikacije sa svetom
Formalnija definicija cistoce – referential transparency.
Kad su funkcije ciste, nema razlike koja se prva evaluira.
77
I/O – stvaranje novih svetova
78
I/O
Vrednost tipa IO t je akcija koja proizvodi vrednost tipa t imodifikovani svet nad kojim moze da se izvrsi naredna akcija.
main :: IO () -- vraca akciju koja-- vraca 0-tupl i novi svet
79
I/O
getLine :: IO StringputStrLn :: String -> IO ()
main :: IO ()main = putStrLn "Hello world"
-- da li mozemain = putStrLn (getLine)
80
I/O
main = getLine >>= putStrLn
Ili upotrebom do notacije:
main = do { line <- getLine; putStrLn line}
81
I/O
Promenljiva moze samo jednom da dobije vrednost
main = do { line <- getLine; line <- getLine -- definise novu prom.; -- ...}
82
C i Haskell
do { x <- e; s } = e >>= (\x -> do { s })do { e } = e
(>>=) :: IO a -> (a -> IO b) -> IO b
83
Razmotavanje do notacije
echo :: IO ()echo = do { line <- getLine; putStrLn line }
postaje
echo = getLine >>= (\ line -> putStrLn line }
sto je isto sto i
echo = getLine >>= putStrLn
84
Vracanje vrednosti u IO
getTwoLines :: IO (String, String)getTwoLines = do { line1 <- getLine
; line2 <- getLine; return (line1, line2)}
return :: a -> IO a
echo = getLine >>=(\ line1 -> getLine >>=
(\ line 2 -> return (line1, line2)))
85
Frekvencija reci
Zadatak: Napisati program koji za dati fajl racuna brojpojavljivanja svake reci. Izlaz sortirati pocevsi od najcescekoriscenih reci.
Knutovo resenje za casopis Communications of ACM jezauzimalo desetak strana dokumentovanog koda u Paskalu.
Resenje Daga Mekilroja
tr -cs A-Za-z '\n' |tr A-Z a-z |sort |uniq -c |sort -rn |set ${1}q
86
Type kind
Konstruktori tipova proizvode nove tipove na osnovupostojecih. Dosta nalik obicnim funkcijama.
:k IntInt :: *
:k MaybeMaybe :: * -> *
:k EitherEither :: * -> * -> *
:k Maybe IntMaybe Int :: *
87
CAS 4: HASKELL – GLOSS –BIBLIOTEKA ZA 2D GRAFIKU
Osnovni prikaz
--| Funkcija za prikaz staticke slikedisplay :: Display -- prozor
-> Color -- boja pozadine prozora-> Picture -- slika koju treba prikazati-> IO ()
main = let window = InWindow (400, 400) (20, 20)background = whiteview = circle 40
in display window background view
89
Neke osnovne funkcije
Crtanje:
polygon -- crta konveksan poligonline -- crta poligonalnu linijulineLoop -- crta zatvorenu pol. linijucircle -- crta krug
png -- ucitava PNG fajljpg -- ucitava JPG fajl
90
Neke osnovne funkcije
Transformacije:
scale factorX factorYrotate angletranslate diffX diffY
Kompozicija:
pictures [ p1, p2, p3, ... ]
91
Osnovna animacija
Ako slika zavisi samo od proteklog vremena, mozemo dakoristimo funkciju animate:
animate :: Display -- prozor-> Color -- boja pozadine-> (Float -> Picture) -- f-ja za iscrtavanje-> IO ()
Funkcija za iscrtavanje prihvata kao argument proteklo vremeod pocetka animacije
92
Simulacija
Ako zelimo da pamtimo neko stanje, i da pravimo simulaciju kodkoje se novo stanje uvek racuna samo na osnovu prethodnog,mozemo da koristimo simulate:
simulate :: Display -- prozor-> Color -- boja pozadine-> Int -- broj slajdova po sekundi-> model -- pocetni model-> (model -> Picture)
-- funkcija prikaza-> (ViewPort -> Float -> model -> model)
-- funkcija azuriranja modela-> IO ()
Funkcija simulate nam daje pristup i velicini prozora.
93
Ulaz sa tastature i misa
Nadogradnja simulacije koja dozvoljava korisnicku obradudogadjaja se zove play
play :: Display -- prozor-> Color -- boja pozadine-> Int -- broj slajdova po sekundi-> world -- pocetni svet-> (world -> Picture)
-- funkcija prikaza-> (Event -> world -> world)
-- funkcija obrade dogadjaja-> [Float -> world -> world]
-- azuriranje modela-> IO ()
94
CAS 5: HASKELL – FUNKTORI IMONADE
Funktori
class Functor f wherefmap :: (a -> b) -> f a -> f b
96
Funktori: Liste
class Functor f wherefmap :: (a -> b) -> f a -> f b
instance Functor [] wherefmap = map
97
Funktori: Maybe
class Functor f wherefmap :: (a -> b) -> f a -> f b
instance Functor Maybe wherefmap f (Just x) = Just (f x)fmap f Nothing = Nothing
98
Funktori: Maybe
class Functor f wherefmap :: (a -> b) -> f a -> f b
instance Functor Maybe wherefmap f (Just x) = Just (f x)fmap f Nothing = Nothing
99
Funktori: Primeri
stringToUpper :: String -> StringstringToUpper s = fmap toUpper s
loginName :: Maybe String-- Just jack-- Nothing
name = fmap stringToUpper loginName-- Just JACK-- Nothing
100
Funktori: Primeri
data Pair = Pair a a deriving (Eq, Show)
instance Functor Pair wherefmap f (Pair a1 a2) = Pair (f a1) (f a2)
fmap (+2) $ Pair 2 3-- Pair 4 5
101
Funktori: Primeri
data Pair = Pair a a deriving (Eq, Show)
instance Functor Pair wherefmap f (Pair a1 a2) = Pair (f a1) (f a2)
fmap (+2) $ Pair 2 3-- Pair 4 5
102
Funktori: Either
data Either a b = Left a| Right b
:k Either :: * -> * -> *
Funktor zahteva samo * -> *, pa ne mozemo da napravimoinstancu funktora za Either. Ali mozemo za Either a(karijevanje).
instance Functor (Either e) where-- (a -> b) -> (Either e a) -> (Either e b)fmap f (Left e) = Left efmap f (Right a) = Right (f a)
103
Funktori: Either
Either ErrorType Int
sqrt' x = if x >= 0 then Right (sqrt x)else Left "Broj je negativan"
104
Funktori: Either
stringToUpper :: String -> StringstringToUpper s = fmap toUpper s
loginName :: Either String String-- Right jack-- Left "Neka greska"
name = fmap stringToUpper loginName-- Right JACK-- Left "Neka greska"
105
Funktori: Parovi
Slicno ponasanje je i za parove - funkcija se racuna za drugielement para:
fmap (+4) ("You are number", 2)-- ("You are number", 6)
fmap show ("You are number", 6)-- ("You are number", "6")
Pogledati Bifunctor
106
Funktori: IO
instance Functor IO wherefmap f action = do
result <- actionreturn (f result)
Na primer, sledece vraca akciju koja ce vratiti ucitani string sasvim velikim slovima:
fmap toUpperString getLine
main = do lineUpper <- fmap toUpperString getLineputStrLn lineUpper
107
Funktori: Funkcije (->)
instance Functor ((->) r) wherefmap f g = \x -> f (g x)
Sta ovo znaci?
108
Funktori: Funkcije (->)
instance Functor ((->) r) wherefmap = (.)
109
Funktori: Pravila
fmap id = id
fmap (f . g) = fmap f . fmap g
110
Funktori: Pravila
data CountedMaybe a = CountedNothing| CountedJust Int aderiving Show
instance Functor CountedMaybe wherefmap f CountedNothing
= CountedNothingfmap f (CountedJust counter x)
= CountedJust (counter + 1) (f x)
111
Funktori: Pravila
fmap id (CountedJust 0 "hello")-- CountedJust 1 "hello"
112
Monade: Uvod
loginName :: Maybe StringfullNameForLogin :: String -> Maybe String
fmap fullNameForLogin loginName-- Maybe (Maybe String)
113
Monade
class Monad m wherereturn :: a -> m a(>>=) :: m a -> (a -> m b) -> m b
return a >>= k === k am >>= return === mm >>= (\x -> k x >>= h) === (m >>= k) >>= h
114
Monade: Operator bind
Operator (>>=) je ekvivalentan kompoziciji funkcija fmap iflatten (join).
115
Monade: Maybe
loginName :: Maybe StringfullNameForLogin :: String -> Maybe String
loginName >>= fullNameForLogin-- Maybe String
116
Monade: Maybe
loginName >>= settingsForLogin>>= (setting "desiredDisplayName")>>= ...
-- Maybe a -- ako bilo koja funkcija vrati Nothing,-- rezultat je Nothing
117
Monade: Maybe
do login <- loginNamesettings <- settingsForLogindisplayName <- setting "desiredDisplayName"...return result
118
Monade: IO
getLine >>= putStrLn
-- kao:-- join (fmap putStrLn getLine)
119
Monade: Operator then
do _ <- getLineputStrLn "Hello world"
getLine >> putStrLn
120
Monade: Operator then
do putStrLn "Open the pod doors, HAL."putStrLn "I'm sorry, Dave. I'm afraid I can't..."putStrLn "What's the problem?"putStrLn "I think you know what the problem..."
putStrLn "Open the pod doors, HAL.">> putStrLn "I'm sorry, Dave. I'm afraid I...">> putStrLn "What's the problem?">> putStrLn "I think you know what the problem..."
121
Monade: Operator then
do putStrLn "Open the pod doors, HAL."putStrLn "I'm sorry, Dave. I'm afraid I can't..."putStrLn "What's the problem?"putStrLn "I think you know what the problem..."line <- getLineputStrLn line
putStrLn "Open the pod doors, HAL.">> putStrLn "I'm sorry, Dave. I'm afraid I can't...">> putStrLn "What's the problem?">> putStrLn "I think you know what the problem...">> getLine>>= putStrLn
122
Monade: Funkcije za rad sa monadama
join :: m (m a) -> m amfilter :: (a -> Bool) => m a -> m a
mapM, mapM_forM, forM_
forM args $ \ arg ->radimo nesto sa arg
Videti Control.Monad
123
Monade
Logovanje – vrednost i logFuture – vrednost koja ce biti dostupna u buducnostiLekser – vrednost koja je procitana i ostatak ulaza
. . .
124
CAS 5: ELM – OSNOVE
Uvod
elm-lang.org
elm-package.json – osnovne informacije o projektuelm-make src/Main.elm --output app/Main.js –kompajlira program
126
Sintaksa
Slicna Haskelu, uz neke izmene:
: umesto :: – tip funkcije ili promenljive:: umesto : – konsturktor liste<< umesto . – kompozicija funkcija<| umesto $ – aplikacija funkcijetype i type alias umesto data i type
127
Osnovne funkcije programa
main – glavna funkcijainit – inicijalizacija – model i poruka za inicijalizacijuview – funkcija koja deifnise pogled za dati modelupdate – funkcija koja obradjuje poruke i generise novimodel
128