Programske paradigme Funkcionalna · PDF file1. čas: Uvod u funkcionalno programiranje. ......

Preview:

Citation preview

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)

Recommended