Documente Academic
Documente Profesional
Documente Cultură
, a
Traian Florin S, erbanut
FMI, UNIBUC
Departamentul de Informatica,
traian.serbanuta@fmi.unibuc.ro
12 octombrie 2016
1
bazat pe cursul Informatics 1: Functional Programming de la University of Edinburgh
,a (UNIBUC)
Traian Florin S, erbanut PDIntroducere 12 octombrie 2016 1 / 25
Motivat,ie
De ce Haskell?
De ce programare funct, ionala?
Nou
n loc sa modificam
datele existente, calculam
valori noi din valorile
existente, folosind funct, ii
Funct, iile sunt pure: aceleas, i rezultate pentru aceleas, i intrari
,a (UNIBUC)
Traian Florin S, erbanut PDIntroducere 12 octombrie 2016 3 / 25
Motivat,ie
Puternic
Minimalism: mai put, in cod, n mai put, in timp, s, i cu mai put, ine defecte
. . . rezolvnd totus, i problema :-)
,a (UNIBUC)
Traian Florin S, erbanut PDIntroducere 12 octombrie 2016 4 / 25
Motivat,ie
Elegant
Curba de nvat
, are n trepte
Putem scrie programe mici destul de repede
Expertiza n Haskell necesita multa gndire s, i practica
Descoperirea unei lumi noi poate fi un drum distractiv s, i provocator
http://wiki.haskell.org/Humor
,a (UNIBUC)
Traian Florin S, erbanut PDIntroducere 12 octombrie 2016 5 / 25
Organizare
1 Introducere
2 Funct, ii, liste, recursie
3 Operatori, funct, ii, recursie
4 Funct, ii de ordin nalt; Map, Filter, Fold
5 Tipuri de date algebrice
6 Tipuri de date algebrice - evaluarea expresiilor
7 Module s, i clase de tipuri
8 Intrare/Ies, ire
9 Functori, Functori Applicativi, Monoizi
10 Monade I
11 Monade II
12 Zippers
,a (UNIBUC)
Traian Florin S, erbanut PDIntroducere 12 octombrie 2016 6 / 25
Organizare
Resurse
http://bit.do/progdecl
Cele mai noi variante ale cursurilor si laboratoarelor.
,a (UNIBUC)
Traian Florin S, erbanut PDIntroducere 12 octombrie 2016 7 / 25
Organizare
Evaluare
Notare
3 teste (test1, test2, test3) s, i activitate laborator (lab)
40% test1 + 40% test2 + 20% test3 + 10% lab
Nota finala:
Notele vor fi postate (doar) pe pagina Moodle a cursului.
Promovabilitate
Nota finala cel put, in 5
Prezent, a la laborator e obligatorie
minim 50% din nr. total de prezent, e
,a (UNIBUC)
Traian Florin S, erbanut PDIntroducere 12 octombrie 2016 8 / 25
Organizare
Test 1
,a (UNIBUC)
Traian Florin S, erbanut PDIntroducere 12 octombrie 2016 9 / 25
Organizare
Test 2
,a (UNIBUC)
Traian Florin S, erbanut PDIntroducere 12 octombrie 2016 10 / 25
Organizare
Test 3
,a (UNIBUC)
Traian Florin S, erbanut PDIntroducere 12 octombrie 2016 11 / 25
Organizare
Activitate laborator
,a (UNIBUC)
Traian Florin S, erbanut PDIntroducere 12 octombrie 2016 12 / 25
Organizare
,a (UNIBUC)
Traian Florin S, erbanut PDIntroducere 12 octombrie 2016 13 / 25
Programare declarativa vs. imperativa
,a (UNIBUC)
Traian Florin S, erbanut PDIntroducere 12 octombrie 2016 14 / 25
Programare declarativa vs. imperativa
,a (UNIBUC)
Traian Florin S, erbanut PDIntroducere 12 octombrie 2016 14 / 25
Programare declarativa vs. imperativa Exemple
Imperativ (JS)
var numbers = [ 1 , 2 , 3 , 4 , 5 ]
var doubled = [ ]
f o r ( var i = 0 ; i < numbers . l e n g t h ; i ++) {
doubled . push ( numbers [ i ] * 2 )
}
,a (UNIBUC)
Traian Florin S, erbanut PDIntroducere 12 octombrie 2016 15 / 25
Programare declarativa vs. imperativa Exemple
Imperativ (JS)
var numbers = [ 1 , 2 , 3 , 4 , 5 ]
var doubled = [ ]
f o r ( var i = 0 ; i < numbers . l e n g t h ; i ++) {
doubled . push ( numbers [ i ] * 2 )
}
Declarativ (Haskell)
numbers = [ 1 , 2 , 3 , 4 , 5 ]
doubled = map ( \ n > n * 2 ) numbers
,a (UNIBUC)
Traian Florin S, erbanut PDIntroducere 12 octombrie 2016 15 / 25
Programare declarativa vs. imperativa Exemple
Imperativ (JS)
var numbers = [ 1 , 2 , 3 , 4 , 5 ]
var t o t a l = 0
,a (UNIBUC)
Traian Florin S, erbanut PDIntroducere 12 octombrie 2016 16 / 25
Programare declarativa vs. imperativa Exemple
Imperativ (JS)
var numbers = [ 1 , 2 , 3 , 4 , 5 ]
var t o t a l = 0
Declarativ (Haskell)
numbers = [ 1 , 2 , 3 , 4 , 5 ]
t o t a l = f o l d l ( + ) 0 numbers
,a (UNIBUC)
Traian Florin S, erbanut PDIntroducere 12 octombrie 2016 16 / 25
Programare declarativa vs. imperativa Exemple
Imperativ (JS)
var dogsWithOwners = [ ]
f o r ( var d i =0; d i < dogs . l e n g t h ; d i ++) {
dog = dogs [ d i ]
f o r ( var o i =0; o i < owners . l e n g t h ; o i ++) {
owner = owners [ o i ]
i f ( owner && dog . owner_id == owner . i d ) {
dogsWithOwners . push ( { dog : dog , owner : owner } )
}
}}
}
,a (UNIBUC)
Traian Florin S, erbanut PDIntroducere 12 octombrie 2016 17 / 25
Programare declarativa vs. imperativa Exemple
Imperativ (JS)
var dogsWithOwners = [ ]
f o r ( var d i =0; d i < dogs . l e n g t h ; d i ++) {
dog = dogs [ d i ]
f o r ( var o i =0; o i < owners . l e n g t h ; o i ++) {
owner = owners [ o i ]
i f ( owner && dog . owner_id == owner . i d ) {
dogsWithOwners . push ( { dog : dog , owner : owner } )
}
}}
}
Declarativ (SQL)
SELECT * FROM dogs INNER JOIN owners
WHERE dogs . owner_id = owners . i d
,a (UNIBUC)
Traian Florin S, erbanut PDIntroducere 12 octombrie 2016 17 / 25
Programare declarativa vs. imperativa
,a (UNIBUC)
Traian Florin S, erbanut PDIntroducere 12 octombrie 2016 18 / 25
Haskell privire de ansamblu
Expresii s, i funct, ii
Signatura unei funct, ii
f a c t : : I n t e g e r > I n t e g e r
Definit, ii folosind if
f a c t n = i f n == 0 then 1
else n * f a c t ( n 1)
Definit, ii de liste
Intervale s, i progresii
interval = [ c . . e ] [ c , d , e ]
progresie = [20 ,17..1] [20 ,17 ,14 ,11 ,8 ,5 ,2]
progresie = [ 2 . 0 , 2 . 5 . . 4 . 0 ] [2.0 ,2.5 ,3.0 ,3.5 ,4.0]
progresieInfinita = [3 ,7..] [3 ,7 ,11 ,15 ,19 ,..]
p o z i t i i P a r e : : [ I n t e g e r ] > [ I n t e g e r ]
p o z i t i i P a r e xs = [ i | ( i , x ) < [ 1 . . ] zip xs , even x ]
,a (UNIBUC)
Traian Florin S, erbanut PDIntroducere 12 octombrie 2016 20 / 25
Haskell privire de ansamblu
Prelude > : t a
a : : Char
Prelude > : t " ana "
" ana " : : [ Char ]
Prelude > : t 1
1 : : Num a => a
Prelude > : t [ 1 , 2 , 3 ]
[ 1 , 2 , 3 ] : : Num t => [ t ]
Prelude > : t 3 . 5
3 . 5 : : F r a c t i o n a l a => a
Prelude > : t ( + )
( + ) : : Num a => a > a > a
Prelude > : t ( + 3 )
( + 3 ) : : Num a => a > a
Prelude > : t ( 3 + )
( 3 + ) : : Num a => a > a
,a (UNIBUC)
Traian Florin S, erbanut PDIntroducere 12 octombrie 2016 21 / 25
Haskell privire de ansamblu
Expresii ca valori
, eni de rangul I
Funct, iile cetat
Funct, iile sunt valori care pot fi luate ca argument sau ntoarse ca
rezultat
f l i p : : ( a > b > c ) > ( b > a > c )
f l i p f = \ x y > f y x
sau a l t e r n a t i v f o l o s i n d matching
flip f x y = f y x
sau f l i p ca v a l o a r e de t i p f u n c t i e
f l i p = \ f x y > f y x
C u r r y i n g
f l i p = \ f > \ x > \ y > f y x
,a (UNIBUC)
Traian Florin S, erbanut PDIntroducere 12 octombrie 2016 22 / 25
Haskell privire de ansamblu
Compunere si aplicare
,a (UNIBUC)
Traian Florin S, erbanut PDIntroducere 12 octombrie 2016 23 / 25
Haskell privire de ansamblu
Lenevire
Argumentele sunt evaluate doar cand e necesar si doar cat e necesar
Prelude > head [ ]
* * * E x c e p ti o n : Prelude . head : empty l i s t
Prelude > l e t x = head [ ]
Prelude > l e t f a = 5
Prelude > f x
5
Prelude > head [ 1 , head [ ] , 3 ]
1
Prelude > head [ head [ ] , 3 ]
* * * E x c e p ti o n : Prelude . head : empty l i s t
Liste infinite (fluxuri de date)
ones = [ 1 , 1 . . ]
zeros = [ 0 , 0 . . ]
both = z i p ones zeros
s h o r t = take 5 both [ ( 1 , 0 ) , ( 1 , 0 ) , ( 1 , 0 ) , ( 1 , 0 ) , ( 1 , 0 ) ]
,a (UNIBUC)
Traian Florin S, erbanut PDIntroducere 12 octombrie 2016 24 / 25
Haskell privire de ansamblu
Monade
Act, iuni
Secvent, iere
,a (UNIBUC)
Traian Florin S, erbanut PDIntroducere 12 octombrie 2016 25 / 25