Funkcionalno programiranje 1 as Uvod u funkcionalno programiranje
- Slides: 55
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 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(s: 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 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 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
Primeri razlika u matematičkoj i Haskelovoj notaciji
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 -> 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: my. Fun, fun 1, arg_2, x’ Imena lista završavaju se sufiksom s, npr: xs, nss
Struktuiranje koda u Haskelu. 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 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 ¡ ¡ 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 (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, 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 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’), (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 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 = 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đ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 < 0 = − 1 | n == 0 | otherwise = 1 ¡ Otherwise je u standardnoj biblioteci definisan kao 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. (&&) : : 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 && _ = 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 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 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] a head (x: _) = x tail : : [a] tail (_: xs) = xs
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 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 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
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 [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, 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, 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
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’] : : [Char].
> length "abcde" 5 > take 3 "abcde" "abc" > zip "abc" [1, 2, 3, 4] [(’a’, 1), (’b’, 2), (’c’, 3)]
Zadaci ¡ zadaci 02. txt
- Funkcionalno programiranje
- Uvod u objektno orijentisano programiranje
- Raslojavanje jezika
- Funkcionalno raslojavanje jezika
- Uvod jadro zapletka
- Uvod u laboratorijski rad
- Uvod u prezentaciju
- Trojica u trnju redoslijed događaja
- Uvod u teoriju računarstva fer
- Tehničko crtanje slova
- Uvod u baze podataka
- Vrste ugljenikovih atoma
- Tradicionalne lirske vrste
- Uvod u baze podataka pdf
- Krst pri savici zgradba
- Fizikalna profilaksa
- Uvod u laboratorijski rad
- Informatika definicija
- Uvod u finansije
- Iz velegradskog podzemlja ispit
- семинарски рад пример
- Sloh charakteristika osoby
- Uvod u tehnicko crtanje namjestaja
- Primjer maturalnog rada
- Pravopisni kviz
- Uvod u teoriju računarstva fer
- Uvod u povijest
- Uvod u znanstveni rad
- Humana ekologija
- Ja rozpravanie vlastny zazitok
- Osnovni pojmovi informatike
- Uvod jadro zapletka
- Uvod u knjigovodstvo
- Vnútornú kompozíciu literárneho diela tvorí
- Stativ hemija
- Uvod u ekologiju
- Razlagalni spis 9 razred
- Antigona
- Strah u ulici lipa uvod zaplet vrhunac rasplet
- Uvod u psihologiju
- Teme za maturski rad iz bosanskog jezika
- Točka i crta kompozicija smještaj u formatu
- Irena stojkovic fasper
- Uradjene laboratorijske vezbe iz fizike
- Uvod u baze podataka
- Uvod u digitalnu i mikroracunarsku elektroniku
- Twist na bazenu kratak sadržaj
- Književnost 5 razred
- Pravila ponasanja u hemijskoj laboratoriji
- Iskrivljena slova
- Podela geografije
- Seminarski rad sadrzaj
- Uvod u excel
- Sretni kraljević kratak sadržaj
- Mrezni hardver
- Kompozicija epskog djela