250 likes | 417 Views
Bevezetés a funkcionális programozásba. csink.laszlo@nik.bmf.hu 2009. DrScheme. A funkcionális programozást egy DrScheme nevű kevert – azaz imperatív és funkcionális elemeket is tartalmazó – nyelven keresztül mutatjuk be. Szabadon letölthető: http://www.plt-scheme.org/software/drscheme/
E N D
Bevezetés a funkcionális programozásba csink.laszlo@nik.bmf.hu 2009
DrScheme A funkcionális programozást egy DrScheme nevű kevert – azaz imperatív és funkcionális elemeket is tartalmazó – nyelven keresztül mutatjuk be. Szabadon letölthető: http://www.plt-scheme.org/software/drscheme/ A következőkben a funkcionális mag bemutatására koncentrálunk.
A nyelvi környezet Definitions window Itt definiáljuk a függvényeket Interactions window Itt történik a futtatás
Példák (define (negyzet n) ( * n n) ) (define nagy-szam ( + (expt 2 10) (expt 3 100))) ---- > (negyzet 5) 25 > nagy-szam 515377520732011331036461129765621272702107523025
A nyelv szintjei DrScheme a nyelvi szintek hierarchiáját nyújtja: • Beginning student: functions, structures, lists • Intermediate student • Advanced student • Scheme language level Minden szint a hibaüzeneteket a szintnek megfelelően fogalmazza meg. A szintek a szintaktikus és szemantikus korlátozásokban eltérnek, a felhasználó szintje szerint.
Példa egy függvényre (define fac (lambda (n) (if (= n 0) 1 (* n (fac (- n 1))))))
A DrScheme nyelv vázlatos ismertetése 1. • A Scheme program függvénydefiníciók halmaza, melyeket egymásba lehet ágyazni • A Scheme program végrehajtása egy kifejezés kiértékelését jelenti • A függvényeket (fvnev argumentumok) formában kell írni, például +3 (* 4 5)) ;; 3 + 4 * 5 (fac 3) ;; fac(3) • Az összeadás lehet több argumentumú (+ 1 2 3 4) ;; 10 • A szorzás is lehet több argumentumú (/ 36 6 2) ;; 3
A DrScheme nyelv vázlatos ismertetése 2. • Listák:(length ‘(+ 2 3)) ;; 3length beépített függvény, (+ 2 3) egy 3-elemű lista, a ‘ megakadályozza a kiértékelést:(+ 2 3) ;; 5‘(+ 2 3) ;; (+ 2 3)
cons car • cons (construct szóból) Beépített függvény, két argumentuma van és egy rendezett párt vagy listát ad vissza: (cons '1 '2) ;; (1 . 2)(cons '1 '(2 3 4)) ;; (1 2 3 4)(cons '(1 2 3) '(4 5 6)) ;; ((1 2 3) 4 5 6) • car rendezett pár vagy lista első elemét adja vissza(car '(123 245 564 898)) ;; 123(car '(egy ketto harom) ;; egy
cdr list • cdr a rendezett pár második elemét; vagy a lista fej nélküli részét szolgáltatja:(cdr '(7 6 5)); (6 5)(cdr '(5 . 16)) ; 16 listaelem!!(cdr '(5 26)) ; (26) lista!! (cdr '(it rains every day)) ;; (rains every day)(cdr (cdr '(a b c d e f))) ;; (c d e f) • list készít egy listát a listaelemekből:(list 'a) ; (a)(list 'a 's 'd) ; (a s d)(list '(a b c) '(d e f) '(g h i)) is ((a b c)(d e f)(g h i))
cons és list különbsége: • (cons ’1 ’2) ; (1 . 2) • (list '1 '2) ; (1 2) • (cons '(3 4) '(5 6)) ; ((3 4) 5 6) • list '(3 4) '(5 6)) ; ((3 4) (5 6))
length reverse append • (length '(1 2 3 4 5)) ; 5 • (length '((1 2 3 4 5) (7 8 9))) ; 2 • (reverse '( 1 2 3)) ; (3 2 1) • (append '(1 2) '(6 7 8 9)) ; (1 2 6 7 8 9)
Trükkök • (append '(a b c) '()) • (list '(a b c) '() ) • (cons '(a b c) '() ) Scheme kód Lehetséges eredmények • ((a b c) ) • (a b c) • ((a b c) ()) Párosítás? Kattintson ide!
A megfejtés 1 – B 2 – C 3 - A
Gyakorlat… Tekintsük a (minden x (ha (ember x) (halando x))) listát, és adjuk meg a Scheme kódot, ami a minden, ha illetve ember szavakat előállítja! • (car '(minden x (if (ember x) (halando x)))) minden • (car (car (cdr (cdr '(minden x (if (ember x) (halando x))))))) ha • (car (car (cdr(car (cdr (cdr '(minden x (if (ember x) (halando x))))))))) ember
Lambda kifejezések • A felhasználó által definiált függvények névvel nem rendelkező ún. lambda kifejezéseket használnak:(lambda (formális paraméter) kifejtés)Példa:((lambda (x) ( * x x)) 3) ; 9((lambda (x y) (+ x y)) 3 4) ; 7
Fibonacci sorozat (define fib (lambda (n) (if (= n 0) 0 (if (= n 1) 1 (+ (fib (- n 1)) (fib (- n 2)))))))
Lnko (=gcd) (define gcd (lambda (a b) (if (= a b) a (if (> a b) (gcd (- a b) b) (gcd a (- b a))))))
x helyébe m-t, y helyébe n-t írva:(define ack (lambda (m n) (if (= m 0) (+ n 1) (if (= n 0) (ack (- m 1) 1) (ack (- m 1) (ack m (- n 1)))))))
Kiszámíthatóság Az Ackermann függvény példa a kiszámítható, de nem primitíven kiszámítható függvényre. A kiszámíthatóság elméletével nem foglalkozunk (ld. Haladó algoritmusok tárgy).
Listaelemek összeadása (define sum (lambda (lt) (if (null? lt) 0 (+ (car lt) (sum (cdr lt)))))) Futtatási példa:(sum '(1 2 3 4 5)) ; 15
Listaelemek szorzata (define szoroz (lambda (lt) (if (null? lt) 1 (* (car lt) (szoroz (cdr lt))))))
Felhasznált irodalom • http://www.math.grin.edu/courses/Scheme/spring-1997/lab-index.html • http://cs.wwc.edu/~cs_dept/KU/PR/Scheme.html#functions • http://mathworld.wolfram.com/AckermannFunction.html