30
Programske paradigme Funkcionalna paradigma 1. čas: Uvod u funkcionalno programiranje. Programski jezik Haskel. Upoznavanje sa razvojnim okruženjem. Tipovi podataka.

Programske paradigme Funkcionalna · PDF file1. čas: Uvod u funkcionalno programiranje. ... izdvaja poslednji element neprazne liste može definisati preko standardnih funkcija za

Embed Size (px)

Citation preview

Page 1: Programske paradigme Funkcionalna · PDF file1. čas: Uvod u funkcionalno programiranje. ... izdvaja poslednji element neprazne liste može definisati preko standardnih funkcija za

Programske paradigme

Funkcionalna paradigma

1. čas:

Uvod u funkcionalno programiranje.

Programski jezik Haskel.

Upoznavanje sa razvojnim okruženjem.

Tipovi podataka.

Page 2: Programske paradigme Funkcionalna · PDF file1. čas: Uvod u funkcionalno programiranje. ... izdvaja poslednji element neprazne liste može definisati preko standardnih funkcija za

Funkcionalno programiranje

Stil u programiranju u kom je osnovni metod izračunavanja primena funkcija na argumente

Page 3: Programske paradigme Funkcionalna · PDF file1. čas: Uvod u funkcionalno programiranje. ... izdvaja poslednji element neprazne liste može definisati preko standardnih funkcija za

Pojam funkcije

U Haskell-u, funkcija je preslikavanje koje uzima jedan ili

više argumenata i vraća rezultat

double x = x+x

Page 4: Programske paradigme Funkcionalna · PDF file1. čas: Uvod u funkcionalno programiranje. ... izdvaja poslednji element neprazne liste može definisati preko standardnih funkcija za

Primer

Suma celih brojeva u Javi:

total=0;for(i=1;i<=10;i++)

total+=i;

Metod izračunavanja je dodela vrednosti promenljivim.

Page 5: Programske paradigme Funkcionalna · PDF file1. čas: Uvod u funkcionalno programiranje. ... izdvaja poslednji element neprazne liste može definisati preko standardnih funkcija za

Primer

Suma celih brojeva u Haskelu:

sum[1..10]

Metod izračunavanja je primena funkcija.

Page 6: Programske paradigme Funkcionalna · PDF file1. čas: Uvod u funkcionalno programiranje. ... izdvaja poslednji element neprazne liste može definisati preko standardnih funkcija za

Funkcija sum iz prethodnog primera u Haskelu se može ovako implementirati:

sum[] = 0

sum(x:xs) = x + sum xs

Page 7: Programske paradigme Funkcionalna · PDF file1. čas: Uvod u funkcionalno programiranje. ... izdvaja poslednji element neprazne liste može definisati preko standardnih funkcija za

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 ]

Page 8: Programske paradigme Funkcionalna · PDF file1. čas: Uvod u funkcionalno programiranje. ... izdvaja poslednji element neprazne liste može definisati preko standardnih funkcija za

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].

Page 9: Programske paradigme Funkcionalna · PDF file1. čas: Uvod u funkcionalno programiranje. ... izdvaja poslednji element neprazne liste može definisati preko standardnih funkcija za

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

Page 10: Programske paradigme Funkcionalna · PDF file1. čas: Uvod u funkcionalno programiranje. ... izdvaja poslednji element neprazne liste može definisati preko standardnih funkcija za

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

Page 11: Programske paradigme Funkcionalna · PDF file1. čas: Uvod u funkcionalno programiranje. ... izdvaja poslednji element neprazne liste može definisati preko standardnih funkcija za

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

Page 12: Programske paradigme Funkcionalna · PDF file1. čas: Uvod u funkcionalno programiranje. ... izdvaja poslednji element neprazne liste može definisati preko standardnih funkcija za

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

Page 13: Programske paradigme Funkcionalna · PDF file1. čas: Uvod u funkcionalno programiranje. ... izdvaja poslednji element neprazne liste može definisati preko standardnih funkcija za

>drop 3 [1,2,3,4,5]

[4,5]

>length[1,2,3,4,5]

5

>sum[1,2,3,4,5]

15

Page 14: Programske paradigme Funkcionalna · PDF file1. čas: Uvod u funkcionalno programiranje. ... izdvaja poslednji element neprazne liste može definisati preko standardnih funkcija za

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

Page 15: Programske paradigme Funkcionalna · PDF file1. čas: Uvod u funkcionalno programiranje. ... izdvaja poslednji element neprazne liste može definisati preko standardnih funkcija za

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

Page 16: Programske paradigme Funkcionalna · PDF file1. čas: Uvod u funkcionalno programiranje. ... izdvaja poslednji element neprazne liste može definisati preko standardnih funkcija za

Haskel skriptovi

U okviru Haskel skriptova pišemo sopstvene funkcije

Po konvenciji, Haskel skriptovi imaju ekstenziju .hs

Page 17: Programske paradigme Funkcionalna · PDF file1. čas: Uvod u funkcionalno programiranje. ... izdvaja poslednji element neprazne liste može definisati preko standardnih funkcija za

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)

Page 18: Programske paradigme Funkcionalna · PDF file1. čas: Uvod u funkcionalno programiranje. ... izdvaja poslednji element neprazne liste može definisati preko standardnih funkcija za

Neke Hugs komande

Komanda :? daje spisak svih Hugs komandi

Page 19: Programske paradigme Funkcionalna · PDF file1. čas: Uvod u funkcionalno programiranje. ... izdvaja poslednji element neprazne liste može definisati preko standardnih funkcija za

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

Page 20: Programske paradigme Funkcionalna · PDF file1. čas: Uvod u funkcionalno programiranje. ... izdvaja poslednji element neprazne liste može definisati preko standardnih funkcija za

Struktuiranje koda u Haskelu.

Pravilo grupisanja (layout rule)

Page 21: Programske paradigme Funkcionalna · PDF file1. čas: Uvod u funkcionalno programiranje. ... izdvaja poslednji element neprazne liste može definisati preko standardnih funkcija za

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

Page 22: Programske paradigme Funkcionalna · PDF file1. čas: Uvod u funkcionalno programiranje. ... izdvaja poslednji element neprazne liste može definisati preko standardnih funkcija za

Zadaci

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

Page 23: Programske paradigme Funkcionalna · PDF file1. čas: Uvod u funkcionalno programiranje. ... izdvaja poslednji element neprazne liste može definisati preko standardnih funkcija za

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.

Page 24: Programske paradigme Funkcionalna · PDF file1. čas: Uvod u funkcionalno programiranje. ... izdvaja poslednji element neprazne liste može definisati preko standardnih funkcija za

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

Page 25: Programske paradigme Funkcionalna · PDF file1. čas: Uvod u funkcionalno programiranje. ... izdvaja poslednji element neprazne liste može definisati preko standardnih funkcija za

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

Page 26: Programske paradigme Funkcionalna · PDF file1. čas: Uvod u funkcionalno programiranje. ... izdvaja poslednji element neprazne liste može definisati preko standardnih funkcija za

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

Page 27: Programske paradigme Funkcionalna · PDF file1. čas: Uvod u funkcionalno programiranje. ... izdvaja poslednji element neprazne liste može definisati preko standardnih funkcija za

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

Page 28: Programske paradigme Funkcionalna · PDF file1. čas: Uvod u funkcionalno programiranje. ... izdvaja poslednji element neprazne liste može definisati preko standardnih funkcija za

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’])

Page 29: Programske paradigme Funkcionalna · PDF file1. čas: Uvod u funkcionalno programiranje. ... izdvaja poslednji element neprazne liste može definisati preko standardnih funkcija za

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

Page 30: Programske paradigme Funkcionalna · PDF file1. čas: Uvod u funkcionalno programiranje. ... izdvaja poslednji element neprazne liste može definisati preko standardnih funkcija za

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)