FUNKCIONÁLIS PROGRAMOZÁS ELŐADÁS JEGYZET

Hasonló dokumentumok
Funkcionális programozás

FUNKCIONÁLIS PROGRAMOZÁS GYAKORLAT JEGYZET

2019, Funkcionális programozás. 2. el adás. MÁRTON Gyöngyvér

2016, Funkcionális programozás

S2-01 Funkcionális nyelvek alapfogalmai

2019, Funkcionális programozás. 5. el adás. MÁRTON Gyöngyvér

Alapok. tisztán funkcionális nyelv, minden függvény (a konstansok is) nincsenek hagyományos változók, az első értékadás után nem módosíthatók

Funkcionális és logikai programozás. { Márton Gyöngyvér, 2012} { Sapientia, Erdélyi Magyar Tudományegyetem }

2018, Funkcionális programozás

Logikai és funkcionális programozás funkcionális programozás modul

2019, Funkcionális programozás. 4. el adás. MÁRTON Gyöngyvér

FUNKCIONÁLIS PROGRAMOZÁS

2018, Funkcionális programozás

Java II. I A Java programozási nyelv alapelemei

ABSZTRAKCIÓ FÜGGVÉNYEKKEL (ELJÁRÁSOKKAL)

1. Template (sablon) 1.1. Függvénysablon Függvénysablon példányosítás Osztálysablon

Tulajdonságalapú tesztelés

2016, Funkcionális programozás

2018, Funkcionális programozás

Programozási nyelvek (ADA)

Feldspar: Nyelv digitális jelfeldolgozáshoz

Java II. I A Java programozási nyelv alapelemei

Tisztán funkcionális adatszerkezetek (folytatás)

C programozás. 6 óra Függvények, függvényszerű makrók, globális és

Funkcionális nyelvek (egyetemi jegyzet) Páli Gábor János

LUSTA KIÉRTÉKELÉS, LUSTA LISTA

Funkcioná lis prográmozá s Start

Tartalomjegyzék. I. Tillárom 3

A TANTÁRGY ADATLAPJA

Python tanfolyam Python bevezető I. rész

Oktatási segédlet 2014

PROGRAMOZÁSI NYELVEK - CPP. GYAKORLAT JEGYZET

Kifejezések. Kozsik Tamás. December 11, 2016

ANALÍZIS III. ELMÉLETI KÉRDÉSEK

2018, Funkcionális programozás

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós március 3. Széchenyi István Egyetem, Gy r

Alkalmazott modul: Programozás 4. előadás. Procedurális programozás: iteratív és rekurzív alprogramok. Alprogramok. Alprogramok.

A Feldspar fordító, illetve Feldspar programok tesztelése

Tisztán funkcionális adatszerkezetek

Imperatív programozás

PROGRAMOZÁSI NYELVEK - CPP. GYAKORLAT JEGYZET

Rekurzió. Dr. Iványi Péter

Programozás I. 3. gyakorlat. Szegedi Tudományegyetem Természettudományi és Informatikai Kar

Programozás alapjai. 5. előadás

Kifejezések. Kozsik Tamás. December 11, 2016

Doktori értekezés. Diviánszky Péter 2012.

A C# programozási nyelv alapjai

Komputeralgebra Rendszerek

Lineáris belsőpontos Newton-iteráció

OOP #14 (referencia-elv)

PROGRAMOZÁSI NYELVEK - ADA. GYAKORLAT JEGYZET

Programozási nyelvek a közoktatásban alapfogalmak II. előadás

PROGRAMOZÁSI NYELVEK - CPP. ELŐADÁS JEGYZET

11. gyakorlat Sturktúrák használata. 1. Definiáljon dátum típust. Olvasson be két dátumot, és határozza meg melyik a régebbi.

BASH script programozás II. Vezérlési szerkezetek

Készítette: Nagy Tibor István

Programozás II. 2. Dr. Iványi Péter

FUNKCIONÁLIS PROGRAMOZÁS

Funkcionális Nyelvek 2 (MSc)

Programozás alapjai. (GKxB_INTM023) Dr. Hatwágner F. Miklós október 11. Széchenyi István Egyetem, Gy r

és az instanceof operátor

Relációs algebra áttekintés és egy táblára vonatkozó lekérdezések

A szemantikus elemzés helye. A szemantikus elemzés feladatai. A szemantikus elemzés feladatai. Deklarációk és láthatósági szabályok

Java VIII. Az interfacei. és az instanceof operátor. Az interfészről általában. Interfészek JAVA-ban. Krizsán Zoltán

Adattípusok. Max. 2GByte

Adattípusok. Max. 2GByte

Algoritmizálás és adatmodellezés tanítása 1. előadás

MODELLEK ÉS ALGORITMUSOK ELŐADÁS

A C programozási nyelv I. Bevezetés

A C programozási nyelv I. Bevezetés

Máté: Assembly programozás

Algoritmizálás + kódolás C++ nyelven és Pascalban

Bevezetés a programozásba II. 5. Előadás: Másoló konstruktor, túlterhelés, operátorok

ADATBÁZISOK I. Az esetleges hibákat kérlek a csongor@csongorbokay.com címen jelezd! Utolsó módosítás: március 20.

A félév során előkerülő témakörök

Virtuális függvények (late binding)

2018, Funkcionális programozás

Programozás BMEKOKAA146. Dr. Bécsi Tamás 2. előadás

Occam 1. Készítette: Szabó Éva

ködös határ (félreértés, hiba)

Programozás C és C++ -ban

BABEŞ BOLYAI TUDOMÁNYEGYETEM MATEMATIKA ÉS INFORMATIKA KAR BBTE Matek-Infó verseny 1. tételsor INFORMATIKA írásbeli. A versenyzők figyelmébe:

Komputeralgebra rendszerek

Komputeralgebra rendszerek

A TANTÁRGY ADATLAPJA

Karakterkészlet. A kis- és nagybetűk nem különböznek, a sztringliterálok belsejét leszámítva!

Programozás alapjai II. (1. ea) C++

Programozás alapjai II. (1. ea) C++

van neve lehetnek bemeneti paraméterei (argumentumai) lehet visszatérési értéke a függvényt úgy használjuk, hogy meghívjuk

Bevezetés a C++ programozási nyelvbe

Nyelvek típusrendszere (IPM-08sztNYTRE, IPM-08EsztNYTRE)

1. Egyszerű (primitív) típusok. 2. Referencia típusok

Felhasználó által definiált adattípus

Függvények. Programozás alapjai C nyelv 7. gyakorlat. LNKO függvény. Függvények(2) LNKO függvény (2) LNKO függvény (3)

Programozás alapjai C nyelv 7. gyakorlat. Függvények. Függvények(2)

SZÁMÍTÓGÉPES PROBLÉMAMEGOLDÁS

Memóriagazdálkodás. Kódgenerálás. Kódoptimalizálás

Kiterjesztések sek szemantikája

2018, Diszkrét matematika

Aritmetikai kifejezések lengyelformára hozása

Átírás:

FUNKCIONÁLIS PROGRAMOZÁS ELŐADÁS JEGYZET Szerkesztette: Balogh Tamás 2013. május 30. Ha hibát találsz, kérlek jelezd a info@baloghtamas.hu e-mail címen! Ez a Mű a Creative Commons Nevezd meg! - Ne add el! - Így add tovább! 3.0 Unported Licenc feltételeinek megfelelően szabadon felhasználható. 1

Adatok: Név: Horváth Zoltán E-mail: hz@inf.elte.hu Webolal http://www.people.inf.elte.hu/fp Követelmények: Hetente kisbeadandó, nagyobb beadandó, géptermi zh, vizsga 1. Előadás Funkcionális programozás A funkcionális programozás: függvény hívások. A programok: függvények kompoziciója. n faktoriális [1..n] sorozat elemeinek szorzata. fact függvény productum függvény egy sorozat elemeire. fact n = prod [1..n] fact n = product [1..n] Előre definitált függvényhalmaz : StdEnv : Prelude Példa Növelés: inc x = x + 1 Négyzet függvény: square x = x * x squareinc x = square (inc x) = square inc x squareinc 7 square ( inc 7) square ( 7+1) square 8 8 * 8 64 Mohó algoritmus Lusta algoritmus squareinc 7 -- ez van square ( inct 7) ( inc 7) * ( inc 7) 8 * ( inc 7) 8 * 8 64 Normálforma: További helyettesítés már nem végezhető el. Pl.: fent a 64. Függvény definíciók f x = f x függvény definíció g x y = y függvény definíció g 1 2 2 g (f 3) 5 5 Ez csak lusta kiértékeléssel kapható meg, mohóval megakadna az f 3 kiszámolásánál. 2

2. Előadás Modern funkcionális programozási nyelvek jellemzése - Nincs előző értéket megsemmisítő értékadás - Szigorúan típusos, típuslevezetés, polimorfizmus, absztrakt és algebrai típusok - Hivatkozási helyfüggetlenség - Magasabb rendű függvények(az argumentum vagy érték is lehet függvény) - Rekurzió - Lusta kiértékelés a mohóság vizsgálatával - Curry féle módszer: függvénynek egy paramétere van Zermelo-Fraenkel halmazkifejezések: Lista generálás szűrőfeltétellel(opcionális) {x * x \\ x <- [1..] odd (x)} [x * x x <- [1..], odd x] 3. Előadás 8 királynő queens 0 = [[]] queens n = [ q:b b <- b queens (n - 1), q <- [0..7], safe q b] safe q b = and [ not ( checks q b i) i <- [0..( length b) - 1)] checks q b i = q == b!! i abs (q - b!! i) == i + 1 main = print ( length ( queens 8), queens 8) Listák [], [1, 18, 29], [1..10], [1..] [1,2,3] == (1:(2:(3:[]))) : operátor hozzá fűz egy elemet a meglévő lista elejéhez, vagyis ez építi fel a listát. 3

Mintaillesztés hd [x:xs] = x tl [x:xs] = xs fac 0 = 1 fac n n > 0 = n * fac ( n - 1) sum [] = 0 sum [x:xs] = x + sum xs length [] = 0 length [_:xs] = 1 + length xs hd (x:xs) = x tl (x:xs) = xs fac 0 = 1 fac n n > 0 = n * fac ( n - 1) sum [] = 0 sum (x:xs) = x + sum xs length [] = 0 length (_:xs) = 1 + length xs 4. Előadás Típus Típusellenőrzés 1 + True // Type error : argment 2 of + cannot unify demanded type Int with Bool length 3 // argument 1 of length cannot unify demadned type ( a b) length a with Int Típusdefiníciók : Alaptípusok: Int, Real, Bool, Char start :: Int start = 3 +4 x ::[ Int ] x = [1,2,3] y :: [ Bool ] y = [True, True, False ] z :: [[ Int ]] z = [[1,2,3], [1,2]] sum :: [ Int ] -> Int sqrt :: Real - > Real : Alaptípusok: Int, Integer, Float, Double, Bool, Char start :: Int start = 3 +4 x ::[ Int ] x = [1,2,3] y :: [ Bool ] y = [True, True, False ] z :: [[ Int ]] z = [[1,2,3], [1,2]] sum :: Num a => [a] -> a sqrt :: Floatin a => a -> a 4

5. Előadás Osztályok A lstinlinedouble származtatott függvény. Nem kell, és nem is szabad az osztály kulcsszót használni, és példányosítani.. Szinonímák Globális konstansok Egyszer értékelődnek ki, futási időben, és újrafelhasználhatók. Növekszik általuk a memóriaigény, viszont a futási idő csökkenthető. Pl.: smallods =: [1, 3.. 10000 ] smallods = [ 1, 3.. 10000 ] Típusszinonímák fordítási időben cserélődnek Makrók Fordítási időben történik a kiértékelés. black :== 1 white :== 0 black = 1 white = 0 Így tehát a következő kifeejezés nem hibás: black + 1 =2. 5

Magasabbrendű listafüggvények Magasabbrendű függvény: Olyan függvény, amelynek valamelyik paramétere függvény, vagy az eredménye függvény. Filter filter - adott tulajdonságot teljesítő elemek leválogatása. filter ::(a -> Bool )[a] ->[a] //tí pus defin íció: polimorf fv., kétvá ltoz ós, ahol az 1. vá ltoz ó egy fv.(a-ból bool -ba ké pez ő) filter p []= [] filter p [x:xs] p x = [x: filterpxs ] otherwise = filter p xs even x = x mod 2 = = 0 odd = not o even // oddx = not ( even x) evens = filter even [0..] filter :: (a -> Bool ) -> [a] -> [a] filter p [] = [] filter p (x:xs) px = x: filter p xs otherwise = filter p xs even x = x mod 2 = = 0 odd = not. even evens = filter even [0..] Példa: filter even [3,2,2,1] [2, 2] Példa a kód alapján: filter even [2 :1] [2 : filter even [1 :[]] ] [ 2 : filter even []] [2 : [] ] Map Elemenként alkalmazza a paraméterül kapott függvényt. Példa: map inc [2,1,7] [3, 2, 8] map :: (a -> b) [a] -> [b] map f [] = [] map f [x:xs] = [ f x : map f xs] odds = map inc evens map :: (a -> b) -> [a] -> [b] map f [] = [] map f (x:xs) = f x : map f xs odds = map ( +1) evens 6

Foldr Elemenkénti felhasználás általános változata. Pl. a sum egy speciális esete. r betű jelzi, hogy jobbról értékelődik ki. Pl.: foldr (+)[3,2,2,1] 1 + (2 + (3 + 0)). foldr :: (.a ->.(.b ->.b)).b![.a] ->.b foldr f e [] = e foldr f e [x:xs] = f x ( foldr f e xs) sum = foldr (+) 0 // sum xs = dolr (+) 0 xs and = foldr (&&) True foldr :: (a -> b -> b) -> b -> [a] -> b foldr f e [] = e foldr f e (x:xs) = f x ( foldr f e xs) sum = foldr (+) 0 -- sum xs = foldr (+) 0 xs and = foldr (&&) True 6. Előadás Foldr folyt. Miért ilyen a típusleírása? Megfigyelhető, hogy 2 féle típusváltozót tartalmaz. Lehet különbőző típus is. Pl.: Integer, Double q A binér operátornak két féle operandust adhatunk, de az eredménye a 2. operandus típusa lesz. -ben a típusváltozók elötti.-ok azt jelzik, hogy polimorf függvények. A. típusannotációváltozó. A! jelzi, hogy mohó kiértékelésű az adott paraméter. takewhile/dropwhile takewhile - Elemek megtartása, amíg p teljesül. dropwhile - Elemek eldobása, amig p teljesül. Pl.: takewhile even [2,4,5,6] [2, 4] takewhile - takewhile p [] = [] takewhile p [x:xs] p x = [ x : takewhile p xs] otherwise = [] takewhile p [] = [] takewhile p (x:xs) p x = x : takewhile p xs otherwise = [] takewhile - 7

Iterálás f iterálása amíg p nem teljesül. until :: (a -> Bool ) (a -> a) a -> a until p f x p x = x otherwise = until p f ( f x) Példa: négyzetgyök számítása Newton-iterációval sqrtn :: Real - > Real sqrtn x = until goodenough improve 1. 0 where improve y = (y + x / y) / 2.0 goodenough y = (y * y) ~=~ x (~x~) a b = abs (a - b) < 0. 000001 Listák Mivel a listában csak egy féle elemet tartalmazhat, így ha az 1. elem int, akkor az összes listaelem int típusú. Ez csak szigorúan típusos nyelvekben van így, például Erlangban nem. 3*x szintén int kell hogy legyen, hiszem az 1. operandus int. 9. Előadás Műveletek listákkal Flatten Listák listájából lesz egy lista. Ezt látni abból, hogy az x-et nem az : operátorral fűzzűk a rekurzívan meghívott flatten függvényhez, hanem a ++ operátorral. flatten [ x: xs] = x ++ flatten xs flatten [] = [] ismember függvény Második paramétere egy [a] típus lista. Jobb oldalon szerepel: x == e, és x eleme a listának, ebből adódik, hogy az első paraméterének típusa megegyezik a második paraméterben szereplő listában szereplő elemek típusával. Az eredmény logikai típus, hiszen a második sorában az eredmény értéke False. flatten [ x: xs] = x ++ flatten xs flatten [] = [] Típusosztályok használata 8

10. Előadás Listing. 10. Gyakorlat Magasabbrendű függvények Map függvény Megjegyzés: A kapott lista hossza és a visszaadott lista hossza megegyezik. map f [] = [] map f (x:xs) = f x : map f xs map függvény Filter függvény filter p [] = [] filter p (x:xs) p x = = True = x: filter p xs p x = = False = filter p xs filter függvény Filter függvény filter p [] = [] filter p (x:xs) p x = = True = x: filter p xs p x = = False = filter p xs filter függvény Count függvény a filter segítségével count p xs = length ( filter p xs) count függvény Iterate iterate f x = x : iterate f ( f x) iterate All all p [] = True all p (x:xs) p x = = True = True && all p xs p x = = False = False all 9

Any any p [] = False any p (x:xs) p x = = True = True p x = = False = any p xs any zipwith függvény zipwith függvény zipwith f (x:xs) (y:ys) = f x y : zipwith f xs ys zipwith f = [] differences függvény differences függvény differences xs = zipwith ( -) ( drop 1 xs) xs Forrás - ELTE IK programtervezői informatikus szak 2013 tavaszi féléves Funkcionális programozás előadás alapján írt órai jegyzetem. 10