Funkcionális programozás 1. gyakorlat

Download Report

Transcript Funkcionális programozás 1. gyakorlat

Funkcionális programozás
2. gyakorlat
2011.02.15.
Batha Dorián
Elérhetőség
Batha Dorián
 E-mail: [email protected]
 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: ghci paranccsal
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..] ]