Professional Documents
Culture Documents
Zašto?
Kompleksno/Komplicirano.
https://en.wikipedia.org/wiki/Rube_Goldberg_machine
Programiranje je teško?
1. DA?
2. NE?
Koliko početniku treba da razumije 5 linija koda?
Koliko stručnjaku treba da razumije 5 linija koda?
B = 2;
C = B;
B = A;
A = C;
Zadatak
Zamijenio je dva broja.
Di je tu problem?
randomA a = Random.int() * a
Čiste funkcije
● “Prave” (matematičke) funkcije
● Funkcije koje ne mogu mijenjati vrijednosti
● Za iste vrijednosti koje pošaljemo uvijek dobijemo istu vrijednost nazad
● Kako išta korisno onda možemo raditi?
● Ne možete mjenjati stanje programa i komunicirati sa “svijetom”, osim ako funkciju tako ne
“označite” (tada su “nečiste”)
● Kompozicija?
(5,3)
Haskell
λ> :t swap
Hello world
λ> :t writeDownStuff
writeDownStuff :: ??
Haskell IO
λ> let writeDownStuff = do putStrLn "Hello"; putStrLn "World";
λ> :t writeDownStuff
writeDownStuff :: IO ()
putStrLn "Hello"
putStrLn "World"
Haskell idealni razvoj
functional-core-imperative-shell
IO
Čiste funkcije
Korisnost odvajanja operacije “efekata” (IO)
● STM? Software Transactional Memory
● Način izrade konkurentnih (kažimo jednostavnije paralelnih) programa
● Retry logika (IF postoji promjena u vezanoj varijabli THEN RETRY;)
● Koji problemi mogu ovdje nastati? (Računi Marko i Ana)
1000
Marko
AKKO Ana
100
Parametri, Curry-ing
λ> :t fst
λ> :t (+1)
λ> :t nonAnonFunction
A C
Kompozicija
λ> :t swap
Rezultat?
Kompozicija
λ> ((+1) . fst . swap) (3,5)
λ> :t (.)
A C
Kompozicija drugih funkcija
● Razmislimo malo
● Kompozicija funkcija sa IO operacijama?
● Baza?
● Primjer u “stvarnosti”?
IO
Čiste funkcije
Podatkovne strukture
λ> data TestList a = TestListHead | TestHead a (TestList a)
λ> :t TestList
TestList :: a ->TestList a
λ> :info []
data [] a = [] | a : [a]
λ> :i String
Podatkovne strukture
λ> :i String
λ> :i Num
class Num a where
(+) :: a -> a -> a
(-) :: a -> a -> a
(*) :: a -> a -> a
negate :: a -> a
abs :: a -> a
signum :: a -> a
fromInteger :: Integer -> a
Type-level programiranje
● Compiler provjerava umjesto vas
● Nemojte koristiti type-level programiranje osim ako točno znate što radite
● Velika sigurnost
● Velika muka za čitanje (još uvijek)
● Kada imaš čekić, ...
Extenzije
● Svaka extenzija u Haskell-u je drugi programski jezik
● Ima puno extenzija
● Radi se na extenzijama za dependent types (ili nečemu što tamo vodi)
● Puno ekstenzija rad je istraživača koji na jednu ekstenziju potroše godine (istraživači su često
doktori jako teških škola)
Lens
Postoje i library koji toliko promjene sintaksu da se čini da pišete drugi programski jezik. Matematičari su
krivi. Mora netko biti.
http://hackage.haskell.org/package/lens
"goal"