Funkcionalno programiranje - specijalno izdanje,...

Preview:

Citation preview

Funkcionalno programiranjespecijalno izdanje, akademska godina 2016/17

Matematicki fakultet

Ivan Cukic

ivan@math.rshttp://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

Recommended