Funkcionalno programiranje 1 as Uvod u funkcionalno programiranje

  • Slides: 55
Download presentation
Funkcionalno programiranje 1. čas: ¡ Uvod u funkcionalno programiranje. ¡ Programski jezik Haskel. ¡

Funkcionalno programiranje 1. čas: ¡ Uvod u funkcionalno programiranje. ¡ Programski jezik Haskel. ¡ Upoznavanje sa razvojnim okruženjem. ¡ Osnovno o tipovima. ¡ Definisanje funkcija.

Funkcionalno programiranje ¡ Stil u programiranju u kom je osnovni metod izračunavanja primena funkcija

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

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

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

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[] =

¡ Funkcija sum iz prethodnog primera u Haskelu se može ovako implementirati: sum[] = 0 sum(s: xs) = x + sum xs

Još jedan primer funkcije u Haskelu qsort [ ] = [ ] qsort (x

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

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 predstavlja implementaciju standarda Haskel 98 ¡ Hugs je interpreter i najčešće je

Sistem 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 , nhc 98, UHC, Yhc , jhc, lhc ¡ Hugs se može preuzeti sa www. haskell. org/hugs ¡

Startovanje Hugs-a __ __ ________________________ || ||__ Hugs 98: Based on the Haskell 98

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

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,

>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,

>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,

>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

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

Primeri razlika u matematičkoj i Haskelovoj notaciji

Primeri razlika u matematičkoj i Haskelovoj notaciji

Haskel skriptovi ¡ ¡ U okviru Haskel skriptova pišemo sopstvene funkcije Po konvenciji, Haskel

Haskel skriptovi ¡ ¡ U okviru Haskel skriptova pišemo sopstvene funkcije Po konvenciji, Haskel skriptovi imaju ekstenziju. hs

primer 1. hs size : : Int size = 12+13 double : : Int

primer 1. 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

Neke Hugs komande Komanda : ? daje spisak svih Hugs komandi

Konvencije za imenovanje promenljivih ¡ ¡ Imena funkcija i argumenata počinju malim slovom, npr:

Konvencije za imenovanje promenljivih ¡ ¡ Imena funkcija i argumenata počinju malim slovom, npr: my. Fun, fun 1, arg_2, x’ Imena lista završavaju se sufiksom s, npr: xs, nss

Struktuiranje koda u Haskelu. Layout rule

Struktuiranje koda u Haskelu. Layout rule

Uz ovakvo zapisivanje, nema potrebe za zagradama koje bi ukazivale na grupisanje definicija a=b+c

Uz ovakvo zapisivanje, nema potrebe za zagradama koje bi ukazivale na grupisanje definicija a=b+c where b=1 c=2 d=a*2 implicitno grupisanje znači a=b+c where {b = 1; c = 2} d=a*2 eksplicitno grupisanje

Zadaci ¡ Ispraviti greške u navedenom skriptu pa ga pokrenuti u Hugs-u.

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

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

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

¡ 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’,

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) :

Torke ¡ Torka je niz vrednosti koje mogu biti različitog tipa: (False, True) : : (Bool, Bool) (False, ’a’, True) : : (Bool, Char, Bool) ¡ Izraz (t 1, t 2, . . . , 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,

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

Tipovi funkcija ¡ Funkcija je preslikavanje vrednosti jednog tipa u vrednosti drugog tipa not : : Bool->Bool is. Digit : : Char -> Bool t 1 ->t 2 je tip funkcije koja preslikava vrednosti tipa t 1 u vrednosti tipa t 2

Zadaci ¡ Odrediti tipove sledećih vrednosti: [’a’, ’b’, ’c’] (’a’, ’b’, ’c’) [(False, ’O’),

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)

Definisanje funkcija. Uslovni iskazi. ¡ Kao u većini programskih jezika, funkcije možemo definisati preko

Definisanje funkcija. Uslovni iskazi. ¡ Kao u većini programskih jezika, funkcije možemo definisati preko uslovnih iskaza: abs : : Int → Int abs n = if n ≥ 0 then n else − n

¡ Uslovni iskazi mogu biti ugnježdeni: signum : : Int → Int signum n

¡ Uslovni iskazi mogu biti ugnježdeni: signum : : Int → Int signum n = if n < 0 then − 1 else if n == 0 then 0 else 1 U Haskelu, uslovni iskazi uvek moraju imati i else granu

Ograđene jednačine (guarded equations) ¡ Umesto uslovnih iskaza, funkcije se mogu definisati i korišćenjem

Ograđene jednačine (guarded equations) ¡ Umesto uslovnih iskaza, funkcije se mogu definisati i korišćenjem ograđenih jednačina abs n | n ≥ 0 = n | otherwise = −n

¡ Kada imamo više uslova, preglednije je koristiti ograđene jednačine: signum n | n

¡ Kada imamo više uslova, preglednije je koristiti ograđene jednačine: signum n | n < 0 = − 1 | n == 0 | otherwise = 1 ¡ Otherwise je u standardnoj biblioteci definisan kao True

Uparivanje šablona (pattern matching) not : : Bool ¡ not False = True ¡

Uparivanje šablona (pattern matching) not : : Bool ¡ not False = True ¡ not True = False ¡ not uparuje False sa True, i True sa False.

Funkcije mogu biti definisane na razne načine preko uparivanja šablona. Npr. (&&) : :

Funkcije mogu biti definisane na razne načine preko uparivanja šablona. Npr. (&&) : : Bool True && True = True && False = False && True = False && False = False može biti kraće definisano : True && True = True _ && _ = False

Međutim, naredna definicija je efikasnija: True && b = b False && _ =

Međutim, naredna definicija je efikasnija: True && b = b False && _ = False Napomena: ¡ The podvlaka _ is a džoker (wildcard) šablon koji odgovara bilo kojoj vrednosti.

Šabloni se uparuju po redu ¡Šta vraća sledeća definicija? _ && _ = False

Šabloni se uparuju po redu ¡Šta vraća sledeća definicija? _ && _ = False True && True = True ¡ U šablonima se ne smeju ponavljati promenljive. Na primer, naredna definicija dovodi do greške: b && b = b _ && _ = False

Šabloni lista Interno, svaka neprazna lista se konstruiše pomoću operatora : koji dodaje element

Šabloni lista Interno, svaka neprazna lista se konstruiše pomoću operatora : koji dodaje element na početak liste [1, 2, 3, 4] je u stvari 1: (2: (3: (4: []))).

Pomoću šablona možemo definisati i funkcije za rad sa listama. head : : [a]

Pomoću šablona možemo definisati i funkcije za rad sa listama. head : : [a] a head (x: _) = x tail : : [a] tail (_: xs) = xs

Napomene ¡ x: xs šablon odgovara samo nepraznim listama: > head [] Error ¡

Napomene ¡ x: xs šablon odgovara samo nepraznim listama: > head [] Error ¡ x: xs šabloni moraju se navoditi u zagradama, jer primena funkcije ima prioritet nad operatorom : . Tako, naredna definicija dovodi do greške: head x: _ = x

Šabloni nad celim brojevima Funkcije nad celim brojevima možemo definisati preko n+k šablona, gde

Šabloni nad celim brojevima Funkcije nad celim brojevima možemo definisati preko n+k šablona, gde je n celobrojna promenljiva a k>0 is celobrojna konstanta. pred : : Int pred (n+1) = n pred preslikava svaki pozitivan ceo broj u njegovog prethodnika.

Napomene ¡ n+k šabloni odgovaraju samo celim brojevima većim od k. > pred 0

Napomene ¡ n+k šabloni odgovaraju samo celim brojevima većim od k. > pred 0 Error ¡ n+k šabloni se moraju navoditi u zagradama, jer primena funkcije ima veći prioritet od +. Na primer, naredna definicija daje grešku: pred n+1 = n

Zadaci ¡ zadaci 01. txt

Zadaci ¡ zadaci 01. txt

Zadavanje lista Matematička notacija: {x 2 | x {1. . . 5}} U Haskelu:

Zadavanje lista Matematička notacija: {x 2 | x {1. . . 5}} U Haskelu: [x^2 | x [1. . 5]] Izraz x [1. . 5] zovemo generatorom liste

¡ Lista se može zadati i sa više generatora: > [(x, y) | x

¡ Lista se može zadati i sa više generatora: > [(x, y) | x [1, 2, 3], y [4, 5]] [(1, 4), (1, 5), (2, 4), (2, 5), (3, 4), (3, 5)]

¡ Šta se dešava ako promenimo redosled generatora? > [(x, y) | y [4,

¡ Šta se dešava ako promenimo redosled generatora? > [(x, y) | y [4, 5], x [1, 2, 3]] [(1, 4), (2, 4), (3, 4), (1, 5), (2, 5), (3, 5)]

Zavisni generatori Kasniji generatori mogu zavisiti od promenljivih koje su uvedeni prethodnim generatorima. [(x,

Zavisni generatori Kasniji generatori mogu zavisiti od promenljivih koje su uvedeni prethodnim generatorima. [(x, y) | x [1. . 3], y [x. . 3]] Lista [(1, 1), (1, 2), (1, 3), (2, 2), (2, 3), (3, 3)] svih parova (x, y) takvih da su x, y elementi liste [1. . 3] and y x.

Primer ¡ concat. hs

Primer ¡ concat. hs

Dodatni uslovi pri definisanju lista (Guards) [x | x [1. . 10], even x]

Dodatni uslovi pri definisanju lista (Guards) [x | x [1. . 10], even x] Primer: factors. hs

Stringovi ¡ Stringovi predstavljaju liste karaktera "abc" : : String [’a’, ’b’, ’c’] :

Stringovi ¡ Stringovi predstavljaju liste karaktera "abc" : : String [’a’, ’b’, ’c’] : : [Char].

> length "abcde" 5 > take 3 "abcde" "abc" > zip "abc" [1, 2,

> length "abcde" 5 > take 3 "abcde" "abc" > zip "abc" [1, 2, 3, 4] [(’a’, 1), (’b’, 2), (’c’, 3)]

Zadaci ¡ zadaci 02. txt

Zadaci ¡ zadaci 02. txt