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*4 14
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)
Uz ovakvo zapisivanje, nema potrebe za zagradama koje bi ukazivale na grupisanje definicija a = b + c where b = 1 c = 2 d = a * 2 znači a = b + c where {b = 1; c = 2} d = a * 2 implicitno grupisanje eksplicitno grupisanje
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)