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

Hasonló dokumentumok
2018, Funkcionális programozás

2018, Funkcionális programozás

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

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

2018, Funkcionális programozás

FUNKCIONÁLIS PROGRAMOZÁS GYAKORLAT JEGYZET

2016, Funkcionális programozás

2018, Funkcionális programozás

2016, Funkcionális programozás

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

Funkcionális programozás

Tulajdonságalapú tesztelés

2018, Funkcionális programozás

2016, Diszkrét matematika

Funkcionális Nyelvek 2 (MSc)

Funkcioná lis prográmozá s Start

2018, Diszkrét matematika

Programozás I gyakorlat

2018, Diszkrét matematika

Programozás burritokkal

Sztringkezelő függvények. A string típusú változók kezelése, használata és szerepük a feldolgozás során

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

2015, Diszkrét matematika

2016, Diszkrét matematika

Tisztán funkcionális adatszerkezetek

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

Imperatív programozás

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

Adatbázisok. 8. gyakorlat. SQL: CREATE TABLE, aktualizálás (INSERT, UPDATE, DELETE), SELECT október október 26. Adatbázisok 1 / 17

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

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

Java-ról Kotlinra. Ekler Péter AutSoft BME AUT. AutSoft

Apple Swift kurzus 3. gyakorlat

Adatszerkezetek és algoritmusok

Delphi programozás IV.

Tartalom Keresés és rendezés. Vektoralgoritmusok. 1. fejezet. Keresés adatvektorban. A programozás alapjai I.

2018, Diszkrét matematika

Feldspar: Nyelv digitális jelfeldolgozáshoz

Adattípusok, vezérlési szerkezetek. Informatika Szabó Adrienn szeptember 14.

Keresés és rendezés. A programozás alapjai I. Hálózati Rendszerek és Szolgáltatások Tanszék Farkas Balázs, Fiala Péter, Vitéz András, Zsóka Zoltán

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

2016, Diszkrét matematika

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

Operációs Rendszerek II. labor. 2. alkalom

The modular mitmót system. DPY kijelző kártya C API

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)

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

1. Feladat: beolvas két számot úgy, hogy a-ba kerüljön a nagyobb

INFORMATIKAI ALAPISMERETEK

Adatszerkezetek és algoritmusok

2018, Diszkrét matematika

Java és web programozás

Imperatív programozás

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

Megoldott feladatok. Informatika

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

Szkriptnyelvek. 1. UNIX shell

Diszkrét Matematika - Beadandó Feladatok

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

Adatbázisok. 9. gyakorlat SQL: SELECT október október 26. Adatbázisok 1 / 14

Algoritmusokfelülnézetből. 1. ELŐADÁS Sapientia-EMTE

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

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.

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

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

SQL haladó. Külső összekapcsolások, Csoportosítás/Összesítés, Beszúrás/Törlés/Módosítás, Táblák létrehozása/kulcs megszorítások

Objektumorientált Programozás III.

Függvények. Programozás I. Hatwágner F. Miklós november 16. Széchenyi István Egyetem, Gy r

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

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

Matematikai programok

2016, Diszkrét matematika

2017, Diszkrét matematika

Szövegek C++ -ban, a string osztály

Adattípusok. Max. 2GByte

Algoritmusok Tervezése. 4. Előadás Visual Basic 1. Dr. Bécsi Tamás

Adattípusok. Max. 2GByte

Matematikai programok

Lineáris algebra 2. Filip Ferdinánd december 7. siva.banki.hu/jegyzetek

A C programozási nyelv I. Bevezetés

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

A programozás alapjai előadás. [<struktúra változó azonosítók>] ; Dinamikus adatszerkezetek:

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

A C programozási nyelv I. Bevezetés

BASH SCRIPT SHELL JEGYZETEK

Adatszerkezetek és algoritmusok

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

HASKELL. Tartalom előadás

Tartalom előadás

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

Feltételezés: A file strukturálisan helyes, tanszékenként nem üres, de az adott listázási feladatban kikötött számút nem haladja meg.

Rendezések. A föltöltés nemcsak az r-re vonatkozik, hanem az s-re is. Ez használható föl a további rendezések

S z á m í t ó g é p e s a l a p i s m e r e t e k

A C programozási nyelv III. Pointerek és tömbök.

Digitális elektronika gyakorlat. A VHDL leírástípusok

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

Tömbök kezelése. Példa: Vonalkód ellenőrzőjegyének kiszámítása

6. gyakorlat Egydimenziós numerikus tömbök kezelése, tömbi algoritmusok

INFORMATIKAI ALAPISMERETEK

Átírás:

Funkcionális programozás 5. el adás Sapientia Egyetem, Matematika-Informatika Tanszék Marosvásárhely, Románia mgyongyi@ms.sapientia.ro 2019, tavaszi félév

Mir l volt szó? a Haskell kiértékelési stratégiája függvények listákon: map, null, lter, reverse take, takewhile, drop, dropwhile, elem, zip, splitat, iterate, repeat, replicate, any, all Haskell modulok, kompilálás

Mir l lesz szó? feladatmegoldás a Show és Read típusosztályok explicit típuskonverziók a struct típus rendezések: beszúrásos rendezés (insert sort), gyorsrendezés (quick sort)

A Show és Read típusosztályok A Show osztály példányai azok a típusok, amelyek átalakíthatóak stringgé. Legtöbbször az I/O m veletek során használjuk. Legegyszer bb függvénye: show :: (Show a) => a -> String > let x = 2 > let y = 4 > let strl = "A " ++ show x ++ " es "++ show y ++ " osszege = "++ show (x + y) > strl "Az 2 es 4 osszege = 6" > show [45, 3, 12, 101, 61] "[45, 3, 12, 101, 61]"

A Show és Read típusosztályok A Read osztály példányai azok a típusok, amelyekre az ellenkez m veletek végezhet ek, mint a Show osztály példányaira. Legegyszer bb függvénye: read :: (Read a) => String -> a, amely megadott típussá átalakítja a String típust. specikálni kell a kimenet típusát > read "5.12" :: Double 5.12 > read "[1, 2, 3]" :: [Int] [1,2,3] > read ["1", "2", "3"] :: [Int] <interactive>:15:7: error:...

A Show és Read típusosztályok readl :: [String] -> [Int] readl str = map read str > readl ["101", "41", "1789"] [101,41,1789] > map (read :: String -> Int) ["101", "41", "1789"] [101,41,1789] > map (read :: String -> Int) $ words "12 34 56" [12,34,56] Megjegyzés: > words "12 45 67 780" ["12","45","67","780"] > words "sapientia egyetem" ["sapientia","egyetem"]

Explicit típuskonverziók Egész típusra (Integral type) való konverzió: Integral (Integer, Int) típusról alakít egy értéket Num (Int, Integer Rational, Double) típusra: fromintegral :: (Num b, Integral a) => a -> b > let negyzetgy n = sqrt (fromintegral n) > negyzetgy 10 3.1622776601683795 Két sajátos formája is van: frominteger :: Num a => Integer -> a tointeger:: Integral a => a -> Integer

Explicit típuskonverziók real típusú értékek és real-fractional típusú értékek közötti átalakítások, ahol a real típus lehet Integral, real-fractional és real-fractional típus lehet Rational, Double típus. A Rational típus végtelen pontosságú törteket jelent realtofrac:: (Real a, Fractional b) => a -> b fromrational :: Fractional a => Rational -> a torational :: Real a => a -> Rational > 1 % 2 + 1 % 3 5 % 6 > torational 1.3 5854679515581645 % 4503599627370496 > torational (fromrational (13 % 10)) 5854679515581645 % 4503599627370496

A struct típus Lehet ség van "saját" típus, új adatszerkezet létrehozására: a data kulcsszó segítségével. data Szemely = Szemely{ nev :: String, jegy :: Double, ev :: Int } deriving (Show) ahol Szemely konstruktor és típus-kontstruktor is egyben. Ha csak egy érték-konstruktor van akkor nem szükséges különböz nevet választani. A deriving kulcsszóval különböz m veletek denícióját adhatjuk meg. A Show osztály a szöveggé alakítást, a kiírást teszi lehet vé.

A struct típus Konstans értékekkel való inicializálás: valaki1 = Szemely "Mari" 4.5 1 szemelyl :: [Szemely] szemelyl = [Szemely "Sari" 8.75 1, Szemely "Mari" 4.25 1, Szemely "Feri" 3.5 2, Szemely "Zsuzsi" 10.0 2, Szemely "Laci" 8.5 2, Szemely "Lori" 7.5 2] Mez értékének a módosítása: modosit :: Szemely -> Double -> Int -> Szemely modosit sze j e = sze {jegy = j, ev = e} Meghívása után a jegy 8.7-re és az ev 2-re módosul: modosit valaki1 8.7 2

Feladatok 1. feladat Számoljuk meg, hogy hány diáknak van átmen jegye. szamol :: [Szemely] -> Int szamol [] = 0 szamol (k: ve) jegy k > 4.5 = 1 + szamol ve otherwise = szamol ve > szamol szemelyl 2

Feladatok 2. feladat Tegyük át egy listába az els éves személyeket valogat :: Int -> [Szemely] -> [Szemely] valogat e [] = [] valogat e (k: ve) ev k == e = (k: valogat e ve) otherwise = valogat e ve > valogat 1 szemelyl [Szemely nev = "Sari", jegy = 8.75, ev = 1,... Második módszer: valogat_ :: Int -> [Szemely] -> [Szemely] valogat_ e ls = [k k <- ls, ev k == e]

Feladatok 3. feladat Határozzuk meg egy listában lev elemek átlagát. atlag :: (Fractional a) => [a] -> a atlag ls = ossz / db where (ossz, db) = satlag ls satlag :: (Fractional a) => [a] -> (a, a) satlag [] = (0.0, 0.0) satlag (k: ve) = (k + temp1, 1 + temp2) where (temp1, temp2) = satlag ve > atlag [1,2,3,6] 3.2

A struct típus: átlagszámolás 4. feladat Határozzuk meg a szemelyl listában lev személyek átlagát. data Szemely = Szemely{ nev :: String, jegy :: Double, ev :: Int } deriving (Show) szemelyl :: [Szemely] szemelyl = [Szemely "Sari" 8.75 1, Szemely "Mari" 4.25 1, Szemely "Feri" 3.5 2, Szemely "Zsuzsi" 10.0 2, Szemely "Laci" 8.5 2, Szemely "Lori" 7.5 2]

A struct típus: átlagszámolás 1. módszer atlagsz :: [Szemely] -> Double atlagsz ls = ossz / db where (ossz, db) = satlag ls satlag ls null ls = (0.0, 0.0) otherwise = (jegy k + temp1, 1 + temp2) where (temp1, temp2) = satlag ve k = head ls ve = tail ls > atlagsz szemelyl 7.083333333333333

A struct típus: átlagszámolás 2. módszer atlagsz :: [Szemely] -> Double atlagsz ls = ossz / db where ossz = sum lsj db = fromintegral (length ls) lsj = valogatj ls valogatj ls = [jegy k k <- ls] > atlagsz szemelyl 7.083333333333333

A struct típus: átlagszámolás 3. módszer atlagsz :: [Szemely] -> Double atlagsz ls = let satlag ls = let k = head ls ve = tail ls (temp1, temp2) = satlag ve in if null ls then (0.0, 0.0) else (jegy k + temp1, 1 + temp2) (ossz, db) = satlag ls in ossz / db > atlagsz szemelyl 7.083333333333333

Beszúrásos rendezés Adott elem beszúrása rendezett listába ins :: (Ord a) => a -> [a] -> [a] ins x [] = [x] ins x (k: ve) x > k = (k: ins x ve) otherwise = (x: (k: ve)) > ins 'h' "abcdeklmno" "abcdehklmno" > ins "racionalis" ["egesz", "komplex", "valos"] ["egesz","komplex","racionalis","valos"]

Beszúrásos rendezés inserts :: (Ord a) => [a] -> [a] inserts [] = [] inserts (k: ve) = ins k (inserts ve) > inserts [3,12,7,8,4,5,11] [3,4,5,7,8,11,12] > inserts "acbdeklhmno" "abcdehklmno"

Gyorsrendezés quicks :: (Ord a) => [a] -> [a] quicks [] = [] quicks (k: ve) = quicks klista ++ [k] ++ quicks nlista where klista = [x x <- ve, x < k] nlista = [x x <- ve, x >= k] > quicks [7,5,9,10,13,2,3,11] [2,3,5,7,9,10,11,13]

Összefésüléses rendezés A merges a merge függvény segítségével rendezi a paraméterként megadott lista elemeit. mergesort :: (Ord a) => [a] -> [a] mergesort [] = [] mergesort [k] = [k] mergesort ls = merge blista jlista where db = div (length ls) 2 blista = mergesort (take db ls) jlista = mergesort (drop db ls) > merges [3,12,6,7,5,9,10,2,10,1] [1,2,3,5,6,7,9,10,10,12]