160 likes | 271 Views
Funkcionális programozás 2. gyakorlat. 2011.02.15. Batha Dorián. Elérhetőség. Batha Dorián E-mail: batha.dorian.elte@gmail.com Tárgy: [fpgyak]_<gyakorlat_száma> Anyagok: kacsi3.web.elte.hu Feladatok beadása: https://pnyf.inf.elte.hu/bead/. Általános tudnivalók.
E N D
Funkcionális programozás2. gyakorlat 2011.02.15. Batha Dorián
Elérhetőség • Batha Dorián • E-mail: batha.dorian.elte@gmail.com • Tárgy: [fpgyak]_<gyakorlat_száma> • Anyagok: kacsi3.web.elte.hu • Feladatok beadása: https://pnyf.inf.elte.hu/bead/
Általános tudnivalók • +/- feladatok: min. 8 leadása, végén +-ban kell lenni • Kisbeadandók: hetente; 8 jó megoldás kell(lesznek szorgalmik is) • Nagybeadandó: 1 db lesz (szükséges feltétele a zh-nak) • Csoport zh: 1 db lesz a félévben
BSc 1. évesek: 1 db jegy (5 kredit) • Gyakorlat kötelező • Jegy: csoport zh és a vizsga zh átlaga • BSc 3. évesek: 1 v 2 db jegy (2 v 2+2 kredit) • Gyakorlat opcionális • Gyakorlat: csoport zh • Kollokvium: félév végén géptermi zh
Bevezetés – a Haskell • A félév tananyaga:Haskell nyelv alapjainak megismerése • Funkcionális nyelv • Erősen típusos • Lusta kiértékelésű
Programozási környezet • Ajánlott: Linux Shell + ghci • GHC: Glasgow Haskell Compiler • Fordító: a megadott modulban definiált main nevű akcióból futtatható programot készít • GHCi: • Interpreter: modulok betöltése; kifejezés kiértékelése; akció végrehajtása • Próbáljuk ki! (Verzió > 6.8 ?)
Az interpreter parancsai Elindítás: ghciparanccsal Parancssor elején: betöltött modul(ok)Kezdetben alapértelmezés: Prelude> Modul betöltése: :l modulnév vagy fájlnév Legutóbb betöltött modul újratöltése: :r Kifejezés kiértékelése vagy akció végrehajtása: írjuk be a kifejezést vagy akciót, aztán enter.Többsoros kifejezés nincs -> modul késíztése Kilépés: :q vagy Ctrl+d (csak Linuxban) Fel és le nyilak: előzőleg begépelt parancsok Tab: parancsok és függvénynevek kiegészítése
Órai anyag mentése • script mentes.txt (Script started, file is mentes.txt) • exit (Script done, file is mentes.txt) • Megjegyzések: - A scriptet a ghci indítása előtt indítsuk el - A mentes.txt tartalma a "Script started" és "Script done" közti rész lesz. - A script-ből kilépés Ctrl+d is lehet exit helyett
Lexikális elemek • Megjegyzések • Egysoros: -- • Többsoros: {- megjegyzés -}. Egymásba ágyazhatók. • Literálok • Egész számok: 1, 5, 119 • Tizedestörtek: 1.1, 0.45, 3e10, 1.3e-10 • Hexadecimális számok: 0xABCD, 0xabcd, 0XabCD • Oktális számok: 0o776, 0O11 • Karakterek: ‘a’, ‘ű’, ‘\n’, ‘\t’ • Szövegek: ”alma” (karakterek listája)
Operátorok – kötési erősségek • Operátor Kötés ^, ^^, ** (.(.)) *, / ((.).) +, - ((.).) ==, /=, <, <=, >, >= - && (.(.)) || (.(.))
Hatványozás • Hatványozás nemnegatív kitevővel: 2 ^ 3 • Hatványozás egész kitevővel: 2 ^^ (-3) • Hatványozás valós kitevővel: 2 ** 0.5 • A hatványozás jobbra köt, ellentétben a négy elemi művelettel!
Gyökvonás, negálás • Gyökvonás • sqrt 2 • Negálás • Az egyetlen prefix operátor • Precedenciája, kötése megegyezik a kivonáséval • - 6 - 2 zárójelezése (-6) - 2 • - 6 ^ 2 zárójelezése -(6 ^ 2) • Hibás kifejezés: 3 + -11; helyesen: 3 + (-11)
További műveletek • A függvényeket `` jel közé téve infix operátorként is használhatjuk. • div (quot) - maradékos osztás • mod (rem) - maradékképzés • Az infix módon használt ‘div‘ és ‘mod‘ kötési erőssége ugyanaz, mint a ‘*‘ és ‘/‘ operátoroké
Listák • Üres lista: [ ] • Elemek felsorolásával: • [1,3,8,6] • [‘a’, ‘x’] • [True,False,True] • Pont-pont kifejezéssel: • [1..4] -> [1,2,3,4] • [2,4..11] -> [2,4,6,8,10] • [0..] -> a természetes számok (végtelen lista) • [1,3..] -> a páratlan számok (végtelen lista)
Alapvető függvények • lenght [1..10] = 10 • [1..10] !! 0 = 1 • „he” ++ „llo” = „hello” • sum [1..10] = 1 + 2 + ... + 10 • product [1..10] = 1 * 2 * ... * 10
Halmazkifejezés • Matematikai példakép: { n^2^ | n ∈ N, n páros } • Haskellben: [ n^2 | n <- [1..], n `mod` 2 == 0 ] • Tetszőlegesen sok generátor és feltétel. • A halmazokkal ellentétben az elemekből több is lehet és számít a sorrend. • A generátorokkal bevezetett új változók csak a generátortól jobbra láthatóak, tehát a következő hibás: [ n^2 | n `mod` 2 == 0, n <- [1..] ]