funkcionalno programiranje - lightgrayÄ udno...
TRANSCRIPT
![Page 2: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/2.jpg)
UVOD
![Page 3: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/3.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
O kursu
Predavanja: Ivan Čukić
e-pošta: [email protected]
stranica kursa: www.math.rs/~ivan/?content=fp
stranica asistenta:https://ivan-ristovic.github.io/courses/fp/
ako poincare ne radi: cukic.co/to/matf/fp
Vežbe: Ivan Čukić i Ivan Ristović
3
![Page 4: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/4.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Funkcionalno programiranje
Šta je funkcionalno programiranje?
4
![Page 5: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/5.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Osobine FP jezika
funkcije višeg reda
čistoća
lenjost
stroga tipiziranost
Ako uzmemo sve ovo kao preduslov da jezik bude funkcionalan, većina jezikaće otpasti.
5
![Page 6: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/6.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Jezici
Lisp -- prvi funkcionalni jezik
Haskell -- današnji sinonim za FP
Scala -- mešavina OO i FP paradigmi
Erlang -- jezik za distribuirane sisteme
Elm -- jezik za pisanje veb aplikacija
C++ -- najpopularniji funkcionalni programski jezik :)
6
![Page 7: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/7.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Literatura
Ova prezentacija nije namenjena za učenje
Literatura će biti okačena na mojoj stranici (sve knjige se mogu naćibesplatno na internetu)
Primeri sa vežbi
7
![Page 8: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/8.jpg)
SADRŽAJ KURSA
![Page 9: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/9.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Zašto uzeti ovaj kurs?
FP u svakodnevnom životu
Istorijski, FP i Haskell su bili prvenstveno namenjeni akademskimkrugovima, i često se predaju kao da su i daljeSvrha ovog kursa je da prikaže praktične koncepte FP-a, i njihovu primenu ivan jezika koji se tradicionalno smatraju funkcionalnim
Ako volite da programirate
FP daje novi način razmišljanja o programerskim problemimacould have been one line in Haskell
Ako vam smeta spora evolucija vašeg omiljenog programskog jezika
9
![Page 10: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/10.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Uslovnost
Haskell
Kreće se od nule, uvod prve dve nedeljeI oni koji su imali Haskell na nekom drugom kursu bi trebalo da prisustvujuuvoduPosle uvoda se prelazi na ozbiljnije teme
Druga polovina semestra
FP tehnike u jeziku C++Osnovno predznanje C++-a je neophodno
10
![Page 11: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/11.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Obaveze tokom godine
Kolokvijum (30%)
Ispit (70%)
11
![Page 12: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/12.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Uvod u Haskell
lenjost
karijevanje i parcijalna aplikacija
funkcije višeg reda
map, filter, fold
pattern matching
…
12
![Page 13: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/13.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
C++
Razlike izmedju normalnih FP jezika i C++-a
Intervali, transformacije intervala
Monade, optional/maybe, ...
Primena monada u parsiranju, …
Dizajn softvera kroz reaktivne tokove
13
![Page 14: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/14.jpg)
HASKELL -- OSNOVE, TIPOVI PODATAKA
![Page 15: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/15.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Implementacije Haskella
Postoje mnoge implementacije jezika Haskell:
GHC -- Glasgow Haskell Compiler
UHC -- Ultrecht Haskell Compiler
LHC -- LLVM Haskell Compiler
...
Hugs
15
![Page 16: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/16.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Ekstenzije jezika
Prirodna evolucija jezika -- kompajleri implementiraju ekstenzije koje, ako sepokažu korisnim, mogu kasnije da postanu deo samog jezika.
Neke od interesantnih ekstenzija
OverloadedStrings
LambdaCase
...
16
![Page 17: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/17.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Kompilacija Haskell programa
ghc program.hs # kompajlira program,
# fajl mora da ima main funkciju
Flegovi:
-Wall # upozorenja na potencijalne greške
-Werror # sva upozorenja postaju greške
--make # kompajlira projekat koji ima više modula
-o # izlazni fajl
-XEkstenzija # uključuje ekstenziju jezika
17
![Page 18: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/18.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
REPL -- read–eval–print loop
ghci # pokreće haskell REPL
ghci program.hs # pokreće REPL i učitava funkcije
# iz datog fajla
:module Modul # učitava modul (biblioteku f-ja)
:set +t # za svaki rezultat ispisuje i tip
:set +m # višelinijske definicije
:set -XEkstenzija # uključuje navedenu ekstenziju
Podešavanja se nalaze u ~/.ghci
18
![Page 19: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/19.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Cabal -- sistem za kompilaciju projekata
cabal sandbox init # inicijalizuje ”igralište”
cabal init # pravi haskell projekat
cabal configure # priprema projekat za kompilaciju
cabal build # kompajlira projekat
19
![Page 20: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/20.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Stack -- moderniji sistem za kompilaciju projekata
stack setup # inicijalizacija
stack new # kreiranje novog projekta
stack build # kompajlira projekat
stack ghci # pokrece GHCI
stack exec CMD # pokrece zadatu komandu
20
![Page 21: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/21.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Liste
[] -- prazna lista
(x: xs) -- definisanje liste
-- x je glava, xs je 'rep'
[ 1, 2, 3 ] -- sintaksa za 1 : 2 : 3 : []
[ True, False ] -- lista logičkih vrednosti
21
![Page 22: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/22.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
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 .. ] -- beskonačna lista
22
![Page 23: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/23.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Stringovi
data String = [Char]
”Fun” -- [ 'F', 'u', 'n' ]
'f' : ”un” -- ”Fun”
”f” ++ ”un” -- ”Fun”
U ozbiljnijim projektima, koristiti Data.Text ili Data.ByteString tipove uz-XOverloadedStrings ekstenziju jezika.
23
![Page 24: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/24.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Izrazi i imena
imena počinju malim slovom
cifre, velika i mala slova, _ i '
number = 6
answer = 42
f = sin
f' = cos
24
![Page 25: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/25.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Izrazi i imena
Bilo koji izraz može da dobije ime
Između definicija se stavljaju ”;”
main = print ”You are number 6”
main' = print (”You are number” ++ ”6”)
main'' = print (”You are number” ++ show 6)
25
![Page 26: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/26.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Lokalna imena
Listu definicija imena okružujemo vitičastim zagradama
Između definicija, kao ranije ”;”
main = let number = 6
stringified = show number
in print (”You are number” ++ stringified)
26
![Page 27: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/27.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Lokalna imena
Listu definicija imena okružujemo vitičastim zagradama
Između definicija, kao ranije ”;”
main = print answer
where answer = 42
27
![Page 28: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/28.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Tačke, zapete i zagrade
answer = 42; number = 6;
main = let { number = 6
; stringified = show number
}
in print (”You are number” ++ stringified)
main = print (”You are number” ++ stringified)
where { number = 6
; stringified = show number
}
28
![Page 29: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/29.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Osobine imenovanih izraza
Promenljive nisu promenljive
x = 5
x = 6 -- greška
redosled definicija nije bitan
lenj
fakeDiv x y =
let result = div x y
in if y == 0 then 0 else q
29
![Page 30: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/30.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Osobine imenovanih izraza
rekurzivni -- promenlive su vidljive u svojoj definiciji
answer = 42
main = let answer = answer + 1 -- beskonacna petlja
in print answer -- program se ne završava
30
![Page 31: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/31.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Petlje
Imerativni kod
int fact(int n)
{
int result = 1;
while (n > 1) { result *= n; n--; }
return result;
}
Rekurzivni kod
fact n = if n <= 1 then 1
else n * fact (n - 1)
31
![Page 32: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/32.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Repna rekurzija
Obična rekurzija
fact n = if n <= 1 then 1
else n * fact (n - 1)
Repna rekurzija
fact n = let helper acc n = if n <= 1
then acc
else helper (acc * n) (n - 1)
in helper 1 n
32
![Page 33: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/33.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Funkcije
Novu funkciju definišemo na sledeći način:
add x y = x + y
add2 x = add 2 x
Ponekad možemo da preskočimo promenljive:
add2 = add 2
33
![Page 34: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/34.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Funkcije
Ako infiksne operatore želimo da koristimo kao da su normalne funkcije:
add x y = (+) x y
add = (+)
Ako normalne funkcije želimo da koristimo kao operator
add2 x = 2 `add` x
34
![Page 35: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/35.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Funkcije
Poziv funkcije
print add 2 3 -- error
-- ovo je poziv kao da print ima
-- tri argumenta
print (add 2 3) -- grupišemo izraz da bi Haskell znao
-- da su 2 i 3 argumenti za funkciju add
print $ add 2 3 -- alternativa je operator `$`
35
![Page 36: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/36.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Primer: Ciklična lista
Implementirati funkcije za baratanje cikličnom listom:
insert -- dodaje element kao trenutni
swap -- zamenjuje trenutni element sledećim
remove -- uklanja trenutni element
toNext -- pomera glavu na sledeći element
toPrev -- pomera glavu na prethodni element
36
![Page 37: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/37.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Ciklična lista -- pokušaj 1
Koristimo [Int] da reprezentujemo listu
insert :: Int -> [Int] -> [Int]
insert value list = (???)
37
![Page 38: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/38.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Ciklična lista -- pokušaj 1
swap :: [Int] -> [Int]
swap = (???)
38
![Page 39: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/39.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Ciklična lista -- pokušaj 1
swap :: [Int] -> [Int]
swap [] = []
swap [x] = [x] -- šta ako uklonimo ovaj red?
swap (x1:x2:xs) = x2:x1:xs
39
![Page 40: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/40.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Ciklična lista -- pokušaj 1
swap :: [Int] -> [Int]
swap (x1:x2:xs) = x2:x1:xs
swap xs = xs
40
![Page 41: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/41.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Ciklična lista -- pokušaj 1
swap :: [Int] -> [Int]
swap xs = case xs of
[] -> []
[x] -> [x]
(x1:x2:xs) -> x2:x1:xs
41
![Page 42: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/42.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Tipovi
Šta su tipovi sledećih vrednosti?
[True, False]
[1, 2, 3]
[]
42
![Page 43: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/43.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Korisnički tipovi
Ako želimo da imenujemo neki postojeći tip, koristimo type ključnu reč:
-- Imena tipova počinju velikim slovom
type Ring = [Int]
insert :: Int -> Ring -> Ring
swap :: Ring -> Ring
Na ovaj način krijemo internu implementaciju od korisnika naše biblioteke.
43
![Page 44: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/44.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Generički tipovi
Do sada smo imali samo ciklične liste celih brojeva.
Šta ako želimo da dozvolimo korisniku da pravi ciklične liste proizvoljnog tipa?(kao što bi u C++-u i Javi bio Ring<T>)
-- Tipske promenljive počinju malim slovom
type Ring t = [t]
insert :: t -> Ring t -> Ring t
swap :: Ring t -> Ring t
44
![Page 45: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/45.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Rotiramo listu
type Ring t = [t]
focusNext :: Ring t -> Ring t
focusNext = (???)
45
![Page 46: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/46.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Operacije kontrukcije i konkatenacije
:t (:)
:t (++)
46
![Page 47: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/47.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Implementacija konkatenacije
(++) :: [a] -> [a] -> [a]
[] ++ ys = ys
(x:xs) ++ ys = x : (xs ++ ys)
Rekli smo da ne želimo više da vidimo rekurziju. Kako ovo implementiratikoristeći fold?
47
![Page 48: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/48.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Rotiramo listu na drugu stranu
type Ring t = [t]
focusPrev :: Ring t -> Ring t
focusPrev = (???)
48
![Page 49: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/49.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Rotiramo listu na drugu stranu
type Ring t = [t]
focusPrev :: Ring t -> Ring t
focusPrev ts = reverse (focusNext (reverse ts))
Nije efikasno, ali je dobro za razmišljanje.
49
![Page 50: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/50.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Kompozicija funkcija
(.) :: (b->c) -> (a->b) -> (a->c)
(f . g) x = f (g x)
Alternativno, preko lambda funkcije.
50
![Page 51: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/51.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Operator aplikacije funkcije
($) :: (a -> b) -> a -> b
f $ x = f x
51
![Page 52: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/52.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Efikasnost operacija nad listama
Liste u Haskelu su jednostruko povezane -- glava i rep -- tako da pate od svihproblema koje imaju liste u drugim jezicima.
Alternativne strukture podataka: Data.Sequence, Data.Vector.
52
![Page 53: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/53.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
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)
53
![Page 54: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/54.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Osnovne operacije sa listama
null -- da li je lista prazna?
head last -- prvi, odnosno poslednji element
tail init -- svi osim prvog, odnosno poslednjeg
length ”Hello world” -- 11
reverse ”Hello world” -- ”dlrow olleH”
”Hello world” !! 4 -- 'o'
54
![Page 55: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/55.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Primeri
Ekstraktovanje prve reči iz rečenice
Ekstraktovanje prve dve reči iz rečenice
Obrnuta varijanta mapiranja
55
![Page 56: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/56.jpg)
HASKELL -- OSNOVNE FUNKCIJE, TESTIRANJE
![Page 57: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/57.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
zip
-- zip :: [a] -> [b] -> [(a, b)]
zip ”Hello” ”World”
Primeri:
-- Indeksiranje elemenata liste
withIndex = zip [0..]
-- Računanje parova
pairs xs = zip xs $ tail xs
-- Provera da li je lista sortirana
isSorted xs = and [ x <= y | (x, y) <- pairs xs ]
57
![Page 58: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/58.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
zipWith
-- zipWith :: (a -> b -> c) -> [a] -> [b] -> [c]
zipWith (+) [1..5] [5..]
58
![Page 59: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/59.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
map
map :: (a -> b) -> [a] -> [b]
map length $ words ”The silent old pond a mirror of ancient...”
let ws = words ”The silent old pond a mirror of ancient...”
in zip ws $ map length ws
59
![Page 60: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/60.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
filter
filter :: (a -> Bool) -> [a] -> [a]
let ws = words ”The silent old pond a mirror of ancient...”
in filter ((>5) . snd) (zip ws $ map length ws)
60
![Page 61: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/61.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Fold
foldl
foldl1
foldr
foldr1
61
![Page 62: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/62.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Fold - implementirati naredne funkcije
and :: [Bool] -> Bool
concat :: [[a]] -> [a]
all :: (a -> Bool) -> [a] -> Bool
any :: (a -> Bool) -> [a] -> Bool
length :: [a] -> Int
(!!) :: [a] -> Int -> a
takeWhile :: (a -> Bool) -> [a] -> [a]
map :: (a -> b) -> [a] -> [b]
filter :: (a -> Bool) -> [a] -> [a]
62
![Page 63: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/63.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Generatori lista (List comprehension)
Lista svih neparnih brojeva od 1 do 42
[ x | x <- [1..42], odd x ]
63
![Page 64: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/64.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Testiranje čistih funkcija
Čiste funkcije su lake za testiranje -- jedino što treba da uradimo je dakonstruišemo argumente koje moramo da prosledimo funkciji.
U OOP stilu programiranja, moramo da simuliramo sve potrebne delovespoljašnjeg stanja.
64
![Page 65: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/65.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Testiranje fiksnih tačaka
prop_swap s = s == swap (swap s)
import Test.QuickCheck
quickCheck prop_swap
65
![Page 66: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/66.jpg)
SAKUPLJAČI OTPADAKA
![Page 67: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/67.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Baratanje memorijom
Nizak nivo
Ručno baratanje memorijom vodi ka greškama
Alokacija memorije na hipu
67
![Page 68: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/68.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Brojanje referenci
Svako kopiranje objekta je samo povećanje brojača referenci na tajobjekat
Kad brojač postane nula, objekat je moguće uništiti
Prednosti:
Determinizam
Efikasnost
Memorijska lokalnost (koliko je i sam program)
68
![Page 69: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/69.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Brojanje referenci
Mane:
Ciklične strukture
Mutabilne strukture
Sve operacije su mutabilne
Fragmentacija
Optimizacije:
Odloženo ažuriranje brojača
Spajanje uzastopnih promena brojača
Baferovano ažuriranje brojača
69
![Page 70: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/70.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Mark-and-sweep
Obilazak i obeležavanje grafa objekata
Obilazak svih objekata na hipu i oslobadjanje Onih koji nisu obeleženi
Prednosti:
Radi sa ciklusima
Ne usporava program prilikom kopiranja objekata
Ne usporava program kad objekat postane đubre
70
![Page 71: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/71.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Mark-and-sweep
Mane:
Zaustavljanje sveta
Lokalnost memorije
Fragmentacija
71
![Page 72: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/72.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Mark-and-compact
Obilazak i obeležavanje grafa objekata
Sabijanje:
Proizvoljno: nije bitan redosled objekata posle sabijanjaLinearno: srodni objekti susedni (srodnost kroz pokazivače)Klizajuće: održava se prethodni poredak
Memorijska lokalnost?
72
![Page 73: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/73.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Mark-and-compact: Two finger compaction
Pogodan za objekte iste veličine
Particionisanje skupa sa dva pokazivača
Pripada proizvoljnim algoritmima sabijanja
73
![Page 74: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/74.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Mark-and-compact
Prednosti:
Mala fragmentacija
Lokalnost
Mane:
Sporo skupljanje otpadaka
74
![Page 75: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/75.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Mark-and-compact
Kombinacija sa mark-and-sweep -- tek kad fragmentacija postane velika, radise sabijanje.
75
![Page 76: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/76.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Kopirajući GC
Razdvajanje prostora na fromspace i tospace
Novi objekti se alociraju u tospace delu
Ako nema mesta, živi objekti se pomeraju u fromspace
Stavljaju se prosledjivački pokazivači umesto njih
Uloge fromspace i tospace se obrću
76
![Page 77: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/77.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Kopirajući GC
Prednosti:
Lokalnost
Jednostavno skupljanje otpadaka
Brza alokacija
Mala fragmentacija
Mane:
Manji prostor za alokacije
Kopiranje podataka
Problem kopiranja velikih besmrtnih objekata
77
![Page 78: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/78.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
GC sa generacijama
Stari objekti se retko uništavaju
Novi objekti su često kratkotrajni
Kratkotrajni objekti su retko kad veliki
78
![Page 79: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/79.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
GC sa generacijama
Razdvajanje hipa na više segmenata
Novi objekti se uvek prave u segmentu za najmladje
Objekti koji prožive nekoliko ciklusa u jednom segmentu se pomeraju usegment za starije
Skupljanje otpadaka se fokusira na segmente za mlade dok je to moguće
79
![Page 80: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/80.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Linearni tipovi
Nije dozvoljeno kopiranje
Jedna vrednost može da se iskoristi samo jednom
Nema potrebe za brojanjem referenci, ni GC-om
Determinističko uništavanje objekta
80
![Page 81: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/81.jpg)
PARCIJALNA APLIKACIJA I KARIJEVANJE
![Page 82: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/82.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Parcijalna aplikacija
Od n-arne funkcije f pravimo novu funkciju g tako što funkciji f vežemo nekeod argumenata za konkretne vrednosti.
sum = \ init xs -> foldr (+) init xs
82
![Page 83: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/83.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Karijevanje
Drugačiji pogled na funkcije -- n-arne funkcije gledamo kao funkcije jednogargumenta:
f x y z = x + y + z
f' = \ x -> \ y -> \ z -> x + y + z
83
![Page 84: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/84.jpg)
ADT
![Page 85: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/85.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Stanja programa
Zadatak: Napraviti program koji za datu internet adresu vraca koliko reci natoj adresi ima.
85
![Page 86: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/86.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Stanja programa
struct state_t {
bool started = false;
bool finished = false;
unsigned count = 0;
string url;
socket_t web_page;
};
86
![Page 87: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/87.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Stanja programa
struct state_t {
bool started = false;
bool finished = true;
unsigned count = 42;
string url = ”http://math.rs”;
socket_t web_page = …;
};
87
![Page 88: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/88.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Proizvod tipova
Proizvod tipova A i B je tip čija vrednost sadrži tačno jednu vrednost tipa A itačno jednu vrednost tipa B.
88
![Page 89: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/89.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Primeri
(Int, String)
data Context c = MkContext String c
89
![Page 90: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/90.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Miš
90
![Page 91: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/91.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Stanja programa
Stanja:
Inicijalno
Stanje brojanja
Krajnje stanje
91
![Page 92: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/92.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Stanja programa
enum mode {
initial,
running,
finished
};
92
![Page 93: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/93.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Suma tipova
Suma tipova A i B je tip čija vrednost sadrži ili jednu vrednost tipa A ili jednuvrednost tipa B.
93
![Page 94: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/94.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Maybe
data Maybe a = Nothing | Just a
94
![Page 95: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/95.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Either
data Either a b = Left a | Right b
95
![Page 96: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/96.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Result
data Result a = Error String | Value a
96
![Page 97: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/97.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Brojač
data Brojac = Initial { url :: String }
| Counting { count :: Int, reader :: Int }
| Finished { count :: Int }
97
![Page 98: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/98.jpg)
TEORIJA KATEGORIJA
![Page 99: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/99.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Uvod
Apstraktna teorija funkcija.
99
![Page 100: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/100.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Osnovni pojmovi
Metagraf se sastoji iz objekata a, b, c, ..., i strelica f, g, h, ..., i dve operacije:
Domen, koja dodeljuje objekat a = dom f svakoj strelici f
Kodomen, koja dodeljuje objekat b = cod f svakoj strelici f
_
Oznaka da su a i b domen, odnosno kodomen strelice f je:
f: a -> b
100
![Page 101: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/101.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Osnovni pojmovi
Def. Kategorija je metagraf koji ima dve dodatne operacije:
Identitet, koji dodeljuje strelicu id_b = 1_b : b -> b svakom objektub, gde 1_b zadovoljava 1_b . f = f i g . 1_b = g za svako f : a ->
b i g : b -> c.
Kompozicija, koja dodeljuje strelicu g . f svakom paru strelica f i g sadom g = cod f. g . f se naziva kompozicijom strelica g i f sa g . f :
dom f -> cod g. Kompozicija mora biti asocijativna.
101
![Page 102: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/102.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Primeri kategorija
Skupovi i funkcije
Grupe i homomorfizmi
102
![Page 103: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/103.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Hask kategorija
Kategorija gde su objekti tipovi u Haskelu,
a strelice funkcije A -> B.
_
Identitet je funkcija id, a kompozicija je .
103
![Page 104: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/104.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Monoid
Monoid <M, u, n> u kategoriji <C, ., 1> je objekat M uz dve strelice
u : M . M -> M, koji se naziva množenje
n : 1 -> M, koji se naziva jedinica
U Haskelu se u zove mappend, a n se zove mempty
104
![Page 105: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/105.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Monoid
Pravila:
(<>) = mappend
x <> mempty = x
mempty <> x = x
(x <> y) <> z = x <> (y <> z)
105
![Page 106: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/106.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Monoid
instance Monoid [a] where
mappend = (++)
mempty = []
106
![Page 107: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/107.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Monoid
instance Monoid (Maybe a) where
mappend = -- više mogućnosti
mempty = Nothing
107
![Page 108: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/108.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Funktori
Def. Funktor izmedju kategorija C i D je mapiranje objekata na objekte, istrelica na strelice koje zadovoljava sledeća pravila:
F(f) : F(dom f) -> F(cod f) za svaku strelicu f u kategoriji C
F(g . f) = F(g) . F(f)
F(1_a) = 1_F(a)
108
![Page 109: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/109.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Kategorija funktora
Kategorija gde su:
Kategorije objekti
Funktori strelice
109
![Page 110: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/110.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Funktori
Parametrizovan tip
Plus fmap
_
Litfing
110
![Page 111: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/111.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Endofunktori
Funktori kategorije C na C
111
![Page 112: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/112.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Primeri
Liste
Maybe
Either Int
Either a
112
![Page 113: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/113.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Primeri
Funkcije koje slikaju neki tip r na nešto drugo:
`(->) r`
113
![Page 114: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/114.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Primeri
Krenemo od potpisa za fmap: fmap :: (a -> b) -> f a -> f b
Zamenimo f sa ((->) r): fmap :: (a -> b) -> ((->) r a) ->
((->) r b)
Prezapišemo infiksno: fmap :: (a -> b) -> (r -> a) -> (r ->
b)
114
![Page 115: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/115.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Primeri
instance Functor ((->) r) where
fmap f g = f . g
115
![Page 116: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/116.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Monade
Monada M = <M, return, join> nad kategorijom C se sastoji odendofunktora M : C -> C i dve transformacije return : C -> M(C) ijoin: M(M(C)) -> M(C) koje zadovoljavaju sledeće:
levi identitet:
return a >>= f = f a
desni identitet:
m >>= return = m
asocijativnost:
(m >>= f) >>= g = m >>= (\ x -> f x >>= g)
gde je »= kompozicija join i fmap.
116
![Page 117: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/117.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Monade
levi identitet:
do { x' <- return x do { f x }
; f x
}
desni identitet:
do { x <- m do { m }
; return x
}
117
![Page 118: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/118.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Monade
asocijativnost:
do { y <- do { x <- m | do { x <- m | do { x <- m
; f x | ; do { y <- f x | ; y <- f x
} | ; g y | ; g y
; g y | } | }
} | } |
118
![Page 119: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/119.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Klisli operator
Kompozicija funkcija koje vraćaju monadske vrednosti:
f >=> g = \ x -> f x >>= g
119
![Page 120: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/120.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Klisli operator
Levi i desni identitet:
f >=> return = f = return >=> f
Asocijativnost:
(f >=> g) >=> h = f >=> (g >=> h)
120
![Page 121: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/121.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Monada parcijalnosti
Maybemonada
121
![Page 122: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/122.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Monada izuzetaka
Result E (Either E)
122
![Page 123: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/123.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Par kao monada
Ako je amonoid, onda je (,) amonada:
return b = (mempty, b)
join (a1, (a2, b)) = (mappend a1 a2, b)
123
![Page 124: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/124.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Funkcije kao monada
Krenemo od return :: a -> f a
Zamenimo f sa (->) r i dobijemo
return :: a -> (r -> a)
_
Dakle: return = const
124
![Page 125: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/125.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Funkcije kao monada
Krenemo od: join :: Monad m => m (m a) -> m a
Zamenimo m sa (->) r i dobijamo
join :: (((->) e) (((->) e) a))) -> (((->) e) a)
Posle malo sredjivanja, dobijamo
join :: (e -> e -> a) -> e -> a
_
Dakle: join f = \ x -> f x x
125
![Page 126: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/126.jpg)
ZAKLJUČIVANJE TIPOVA -- HASKELL
![Page 127: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/127.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Tipovi
Obično definišemo tipove kad definišemo promenljive
x :: [Char]
i :: Int
x !! i :: Char;
short i;
std::array<int, 4> a;
a[i] = 6;
127
![Page 128: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/128.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Parametrizovani tipovi
Umesto da pišemo konkretan tip, imamo tipovske promenljive
f :: a -> Bool
g :: a -> a -> a
template <typename T>
T id(T val, std::vector<T> xs) { ::: }
(genericko programiranje, polimorfizam preko tipova)
128
![Page 129: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/129.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Implicitni generički tipovi
Ne definišemo tipove -- kompajler treba da zaključi sam.
let f = \ x -> x
let g = f
let h = \ x -> f x
129
![Page 130: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/130.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Implicitni generički tipovi
let max x y = if x > y then x else y
130
![Page 131: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/131.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Implicitni generički tipovi
let max cmp x y = if cmp x y then x else y
131
![Page 132: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/132.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Implicitni generički tipovi
let foo a b c = c (a !! b)
132
![Page 133: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/133.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Implicitni generički tipovi
let foo a b c = c (a !! b) + a
133
![Page 134: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/134.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Hindley-Milner provera tipova
Zaključuje tipove koji nisu eksplicitno navedeni
Jezik, konstrukti, …
Unifikacija tipova
134
![Page 135: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/135.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Konstante
”Hello” :: String
42 :: Int
True, False :: Bool
135
![Page 136: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/136.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Operacije
<. <=, ==, >=, >, /=
+, -, *, /
!!
136
![Page 137: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/137.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Funkcije
f a b c ... z
137
![Page 138: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/138.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Ograničenja
definicija funkcije
if-then-else
138
![Page 139: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/139.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Unifikacija
počinjemo od korena drveta
kad naletimo na konstrukt sa slobodnim tipovima, napravimo nove tipskeparametre
ako konstrukt ima dodeljena dva tipa T1 i T2, zameniti T1 u celom drvetu
139
![Page 140: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/140.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Primer
let f a b c = c (a !! b)
let f a b = if a then b
else a + 1
let f a b c = if (a !! b) then c b else a
140
![Page 141: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/141.jpg)
ZAKLJUČIVANJE TIPOVA -- C++
![Page 142: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/142.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Šabloni, auto, decltype
template <typename T>
void f(T value) {}
template <typename T>
void f(T& value) {}
template <typename T>
void f(const T& value) {}
template <typename T>
void f(T* value) {}
142
![Page 143: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/143.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Šabloni, auto, decltype
void f(auto value) {}
void f(auto& value) {}
void f(const auto& value) {}
void f(auto* value) {}
auto value = 42;
const auto& value = f();
auto& ref = value;
auto& ptr = &value;
143
![Page 144: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/144.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Šabloni, auto, decltype
template <typename T>
void f(T&& value) {
g(std::forward<T>(value));
}
144
![Page 145: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/145.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Šabloni, auto, decltype
decltype(value) copy = value;
145
![Page 146: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/146.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Perfect forwarding
template <typename T>
decltype(auto) f(T&& value) {
return g(std::forward<T>(value));
}
146
![Page 147: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/147.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Meta-funkcije
template <typename T>
using inner_type_t =
typename T::value_type;
inner_type_t<std::vector<int>>
147
![Page 148: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/148.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Meta-funkcije
template <typename T>
struct inner_type {
using type = typename T::value_type;
};
inner_type<std::vector<int>>::type
148
![Page 149: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/149.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Meta-funkcije
template <typename T, typename Expected = void>
struct expect_inner {
using type = typename T::value_type;
constexpr bool value =
std::is_same_v<type, Expected>;
};
expect_inner<std::vector<int>>::type
expect_inner<std::vector<int>>::value
149
![Page 150: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/150.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Meta-funkcije
template <typename T, typename Expected = void>
using expect_inner_t =
typename expect_inner<T, E>::type;
template <typename T, typename Expected = void>
constexpr bool expect_inner_v =
expect_inner<T, E>::value;
150
![Page 151: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/151.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Meta-funkcije
template <typename C>
??? sum(const C& collection)
{
return …;
}
151
![Page 152: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/152.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Meta-funkcije
template <typename C,
typename Val = inner_type_t<C>>
Val sum(const C& collection)
{
return …;
}
152
![Page 153: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/153.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Tipovi
template <typename T>
class print_types;
153
![Page 154: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/154.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Koncepti
template <typename T>
concept HasValueType =
requires(C c) { typename C::value_type };
template <typename T>
concept HasBeginIterator =
requires(C c) { *std::begin(c); };
154
![Page 155: Funkcionalno programiranje - lightgrayÄ udno izdanjepoincare.math.rs/~ivan/files/fp/presentation.pdf · Funkcionalnoprogramiranje Čudnoizdanje January6,2020 drIvanČukić ivan@math.rs](https://reader031.vdocuments.pub/reader031/viewer/2022041905/5e6313e578cbeb03d179ec64/html5/thumbnails/155.jpg)
Uvod Sadržaj kursa Haskell -- osnove, tipovi podataka Haskell -- osnovne funkcije, testiranje Sakupljači otpadaka Parcijalna aplikacija i karijevanje ADT Teorija kategorija Zaključivanje tipova -- Haskell Zaključivanje tipova -- C++ Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Meta-funkcije Tipovi Koncepti Koncepti
Koncepti
template <typname T>
requires HasValueType<T>
auto sum(C c) {
}
template <typname T>
requires not HasValueType<T>
and HasBeginIterator<T>
auto sum(C c) {
}
155