Programske paradigme Funkcionalna · PDF file1. čas: Uvod u funkcionalno programiranje. ......
-
Upload
vuongnguyet -
Category
Documents
-
view
280 -
download
7
Transcript of Programske paradigme Funkcionalna · PDF file1. čas: Uvod u funkcionalno programiranje. ......
Programske paradigme
Funkcionalna paradigma
1. čas:
Uvod u funkcionalno programiranje.
Programski jezik Haskel.
Upoznavanje sa razvojnim okruženjem.
Tipovi podataka.
Funkcionalno programiranje
Stil u programiranju u kom je osnovni metod izračunavanja primena funkcija na argumente
Pojam funkcije
U Haskell-u, funkcija je preslikavanje koje uzima jedan ili
više argumenata i vraća rezultat
double x = x+x
Primer
Suma celih brojeva u Javi:
total=0;for(i=1;i<=10;i++)
total+=i;
Metod izračunavanja je dodela vrednosti promenljivim.
Primer
Suma celih brojeva u Haskelu:
sum[1..10]
Metod izračunavanja je primena funkcija.
Funkcija sum iz prethodnog primera u Haskelu se može ovako implementirati:
sum[] = 0
sum(x:xs) = x + sum xs
Još jedan primer funkcije u Haskelu
qsort [ ] = [ ]
qsort (x : xs) = qsort smaller ++ [x]++ qsort larger
where
smaller = [a | a ← xs, a ≤ x ]
larger = [b | b ← xs, b > x ]
Zadaci za vežbu
Definisati funkciju product koja vraća proizvod liste brojeva.
Kako treba izmeniti funkciju qsort da bi sortirala listu opadajuće?
Šta bi se u funkciji qsort promenilo ako bismo znak ≤ zamenili sa < ? Razmatrati na primeru qsort[2,2,3,1,1].
Sistem Hugs
Hugs predstavlja implementaciju standarda Haskel 98
Hugs je interpreter i najčešće je korišćen u radu sa Haskelom; pored njega, postoje i drugi sistemi kao što su kompajleri GHC , nhc98, UHC, Yhc , jhc, lhc
Hugs se može preuzeti sa www.haskell.org/hugs
Startovanje Hugs-a
__ __ __ __ ____ ___ _______________________________________________|| || || || || || ||__ Hugs 98: Based on the Haskell 98 standard||___|| ||__|| ||__|| __|| Copyright (c) 1994-2005||---|| ___|| World Wide Web: http://haskell.org/hugs|| || Bugs: http://hackage.haskell.org/trac/hugs|| || Version: Sep 2006 _______________________________________________
Haskell 98 mode: Restart with command line option -98 to enable extensions
Type :? for help
Hugs>2+3*414
Standardna biblioteka funkcija
Biblioteka Prelude.hs obezbeđuje veliki broj standardnih funkcija. Pored osnovnih računskih operacija, ugrađene su i razne funkcije za rad sa listama:
>head[1,2,3,4,5]
1
>tail[1,2,3,4,5]
[2,3,4,5]
>[1,2,3,4,5]!!2
3
>take 3 [1,2,3,4,5]
[1,2,3]
>drop 3 [1,2,3,4,5]
[4,5]
>length[1,2,3,4,5]
5
>sum[1,2,3,4,5]
15
>product [1,2,3,4,5]
120
>[1,2,3]++[4,5]
[1,2,3,4,5]
>reverse[1,2,3,4,5]
[5,4,3,2,1]
Primena funkcija
“primeni funkciju f na argumente a i b i rezultatu dodaj proizvod brojeva c i d”
Matematička notacija: f(a,b) + c d
Haskelova notacija: f a b + c*d
Haskel skriptovi
U okviru Haskel skriptova pišemo sopstvene funkcije
Po konvenciji, Haskel skriptovi imaju ekstenziju .hs
primer1.hs
size :: Int
size = 12+13
double :: Int -> Int
double n = 2*n
square :: Int -> Int
square n = n*n
test :: Int
test = double 320 - square (size - double 6)
Neke Hugs komande
Komanda :? daje spisak svih Hugs komandi
Konvencije za imenovanje promenljivih
Imena funkcija i argumenata počinju malim slovom, npr:
myFun, fun1, arg_2, x’
Imena lista završavaju se sufiksom s, npr:
xs, ns, nss
Struktuiranje koda u Haskelu.
Pravilo grupisanja (layout rule)
znači
Uz ovakvo zapisivanje, nema potrebe za zagradama koje bi ukazivale na grupisanje definicija
a = b + cwhere
b = 1c = 2
d = a * 2
a = b + cwhere
{b = 1;c = 2}
d = a * 2
implicitno grupisanje eksplicitnogrupisanje
Zadaci
Ispraviti greške u navedenom skriptu pa ga pokrenuti u Hugs-u.
Zadaci
Pokazati kako se funkcija standardne biblioteke last koja izdvaja poslednji element neprazne liste može definisati preko standardnih funkcija za rad sa listama.
Pokazati kako se funkcija standardne biblioteke init koja uklanja poslednji element neprazne liste može slično definisati preko standardnih funkcija za rad sa listama.
Tipovi podataka. Osnovni tipovi.
Bool
Char
String
Int – celi brojevi fiksne preciznosti
Integer – celi brojevi proizvoljne preciznosti
Float – realni brojevi jednostruke preciznosti u pokretnom zarezu
Svaki dobro definisan izraz u Haskelu ima svoj tip i on se određuje pre izračunavanja funkcije. Ukoliko za dati izraz ne može da se odredi tip, onda izraz nije validan
Liste
Lista je niz vrednosti istog tipa:
[False, True, False] :: [Bool]
[’a’,’b’,’c’,’d’,’e’] :: [Char]
Lista se može sastojati i od drugih listi
Lista ne mora biti konačna
Torke
Torka je niz vrednosti koje mogu biti različitog tipa:
(False, True) :: (Bool, Bool)
(False,’a’, True) :: (Bool, Char, Bool)
Izraz (t1,t2,...,tn) je tipa n-torke čija i-ta komponenta ima tip ti za svako i od 1 do n
Veličina torke se vidi iz njenog tipa, za razliku od lista
Kod torke, svaka komponenta može biti bilo kog tipa
(‘a’, (False, ‘b’))
(True, [‘a’, ‘b’])
Tipovi funkcija
Funkcija je preslikavanje vrednosti jednog tipa u vrednosti drugog tipa
not :: Bool->Bool
isDigit :: Char -> Bool
t1->t2 je tip funkcije koja preslikava vrednosti tipa t1 u vrednosti tipa t2
Zadaci
Odrediti tipove sledećih vrednosti:
[’a’, ’b’, ’c’](’a’, ’b’, ’c’)[(False, ’O’), (True, ’1’)]([False,True ], [’0’, ’1’])[tail , init, reverse ]
Odrediti tipove sledećih funkcija:
second xs = head (tail xs)swap (x , y) = (y, x )pair x y = (x , y)