web viewfunkcionális nyelvek. király, roland. funkcionális nyelvek....
Post on 06-Mar-2019
215 views
Embed Size (px)
TRANSCRIPT
Bibliogrfia
Bibliogrfia
Funkcionlis nyelvek
Kirly, Roland
Funkcionlis nyelvek
Kirly, Roland
Publication date 2011
Szerzi jog 2011 EKF Matematikai s Informatikai Intzet
Copyright 2011, EKF Mat.- Inf. Int.
A tananyag a TMOP-4.1.2-08/1/A-2009-0046 szm Kelet-magyarorszgi Informatika Tananyag Trhz projekt keretben kszlt.
A tananyagfejleszts az Eurpai Uni tmogatsval s az Eurpai Szocilis Alap trsfinanszrozsval valsult meg.
Nemzeti Fejlesztsi gynksg http://ujszechenyiterv.gov.hu/ 06 40 638-638
Created by XMLmind XSL-FO Converter.
Created by XMLmind XSL-FO Converter.
Created by XMLmind XSL-FO Converter.
Tartalom
1. Funkcionlis nyelvek 0
1. A funkcionlis programozsi nyelvek vilga 0
1.1. A funkcionlis nyelvekrl 0
1.2. A funkcionlis nyelvekrl ltalban 0
1.3. Erlang 0
1.4. Clean 0
1.5. FSharp 0
2. Funkcionlis programok ltalnos jellemzi 0
2.1. Tiszta s nem tiszta nyelvek 0
2.2. Term jrar rendszerek 0
2.3. Grf jrar rendszerek 0
2.4. Alapvet nyelvi konstrukcik 0
2.5. Fggvnyek s rekurzi 0
2.6. Hivatkozsi helyfggetlensg 0
2.7. Nem frissthet vltozk 0
2.8. Lusta s moh kirtkels 0
2.9. Mintailleszts 0
2.10. Magasabb rend fggvnyek 0
2.11. Curry mdszer 0
2.12. Statikus tpusrendszer 0
2.13. Halmazkifejezsek 0
3. Alapvet Input-Output 0
3.1. Programozsi krnyezetek hasznlata 0
3.2. Erlang 0
3.3. Clean 0
3.4. FSharp 0
3.5. Kezdeti lpsek Erlang programok futtatshoz 0
3.6. Clean kezdetek 0
3.7. F# programok rsa s futtatsa 0
3.8. Mellkhatsok kezelse 0
4. Az adatok kezelse 0
4.1. Vltozk 0
5. Kifejezsek 0
5.1. Mveleti aritmetika 0
5.2. Mintailleszts 0
5.3. r felttelek hasznlata 0
5.4. If kifejezs 0
5.5. Case kifejezs 0
5.6. Kivtelkezels 0
6. sszetett adatok 0
6.1. Rendezett n-esek 0
6.2. Rekord 0
7. Fggvnyek s rekurzi 0
7.1. Fggvnyek ksztse 0
7.2. Rekurzv fggvnyek 0
7.3. Rekurzv ismtlsek 0
7.4. Magasabb rend fggvnyek 0
7.5. Fggvny kifejezsek 0
8. Listk s halmazkifejezsek 0
8.1. Lista adatszerkezet 0
8.2. Statikus listk kezelse 0
8.3. Lista kifejezsek 0
8.4. sszetett s begyazott listk 0
9. Funkcionlis nyelvek ipari felhasznlsa 0
9.1. Funckionlis nyelvek az iparban 0
9.2. Kliens-szerver alkalmazsok ksztse 0
10. Funkcionlis nyelvek a gyakorlatban 0
10.1. Programfejleszts Erlangban - a fejleszteszkz belltsai 0
10.2. Programfejleszts Erlangban - a fejleszteszkz belltsai 0
10.3. Az els feladat elksztse 0
10.4. Mdia alap segtsg a megoldshoz 0
10.5. Gyakorl feladatok 0
10.6. A fejezetekhez tartoz kpek (Feladatok szerkeszts kzben s a kimeneti kpernyk) 0
Bibliogrfia 0
Funkcionlis nyelvek
Funkcionlis nyelvek
Created by XMLmind XSL-FO Converter.
Created by XMLmind XSL-FO Converter.
Created by XMLmind XSL-FO Converter.
1. fejezet - Funkcionlis nyelvek
1. A funkcionlis programozsi nyelvek vilga
1.1. A funkcionlis nyelvekrl
A funkcionlis programozsi nyelvek vilga mg a programozk kztt sem igazn kzismert. Legtbbjk az objektum orientlt, valamint az imperatv nyelvek hasznlatban jrtas, s egyltaln nem rendelkezik ismeretekkel az elbbiekrl. Sokszor azt is nehz elmagyarzni, hogy egy nyelv mitl funkcionlis...
Ennek szmos oka van, tbbek kztt az, hogy ezek a nyelvek vagy specilis clokra kszltek, s ezltal nem terjedhettek el szles krben, vagy olyan bonyolult ket hasznlni, hogy az tlag programoz hozz sem kezd, vagy ha igen, akkor sem kpes felnni a feladathoz. Az oktatsban - nhny kvetend kivteltl eltekintve - sem igazn tallkozhatunk ezzel a programozsi paradigmval. Az oktatsi intzmnyek nagy rszben szintn az imperatv s az OO nyelvek terjedtek el, s a jl bevlt mdszereket nehezen vltjk fel jakkal. Mindezek ellenre rdemes komolyabban foglalkozni az olyan funkcionlis programozsi nyelvekkel, mint a Haskell, a Clean, s az Erlang. A felsorolt nyelvek szles krben elterjedtek, jl elsajtthatk, logikus felptsek, s az iparban is alkalmazzk nmelyiket.
Mindezen tulajdonsgaikbl kifolylag ebben a jegyzetben is a felsorolt nyelvek kzl vlasztottunk ki kettt, de nem feledkeztnk el a jelenleg feltrekvben lv nyelvekrl sem, mint az F#, ezrt minden fejezetben e hrom nyelven mutatjuk be a nyelvi elemeket, s a hozzjuk tartoz pldaprogramokat.
A fentiek alapjn, s abbl kiindulva, hogy a kedves olvas ezt a knyvet a kezben tartja, felttelezhetjk, hogy a funkcionlis nyelvekhez csak kis mrtkben, vagy egyltaln nem rt, de szeretn elsajttani a hasznlatukat.
Ebbl az okbl kifolylag azt a mdszert alkalmazzuk, hogy a klnleges funkcionlis nyelvi elemeket az imperatv s az OO program konstrukcikbl vett pldkkal magyarzzuk, valamint megprblunk prhuzamokat vonni a paradigmk kztt.
Abban az esetben, ha nem tudunk olyan " hagyomnyos programozsi nyelvekbl vett elemeket tallni, amelyek az adott fogalom analg megfeleli, akkor a mindennapi letbl, vagy az informatika egyb terleteirl mertnk. Ezzel a mdszerrel bizonyosan elrjk a clunkat.
A jegyzet teht a gyakorlati kpzst, s az emltett programozsi nyelvek gyakorlati oldalrl val megkzeltst tzte ki clul. Termszetesen nagy hangslyt fektetnk a nyelvek tanulsnak elmleti krdseire is, de nem ez az elsdleges clunk. A bemutatsra kerl pldaprogramok elksztst a programozsi stlus elsajttsa rdekben javasoljuk, s, hogy ez a feladat ne okozzon problmt, a programok forrskdjait ahol csak lehet, lpsrl-lpsre bemutatjuk.
1.2. A funkcionlis nyelvekrl ltalban
A funkcionlis nyelvek tanulst rdemes az elmlet megismerse mellett a paradigma filozfiai htternek vizsglatval kezdeni. rdemes tovbb megvizsglni a funkcionlis nyelvek legfbb jellemzit.
A paradigma megismerse sorn kitrnk arra is, hogy mirt, s mikor rdemes ezeket a nyelveket hasznlni. A funkcionlis nyelvek egyik elnys tulajdonsga a kifejezer, ami azt jelenti, hogy viszonylag kevs forrskddal sok mindent le tudunk rni. Ez a gyakorlatban annyit tesz, hogy bonyolult problmkat tudunk megoldani viszonylag rvid id alatt, a lehet legkisebb energia befektetsvel.
A funkcionlis programok nyelvezete kzel ll a matematika nyelvhez. A matematikai formulk szinte egy az egyben trhatk funkcionlis nyelvi elemekre. Ez megint nagyon hasznos, ha figyelembe vesszk azt a tnyt, hogy a programozs nem a fejleszteszkz elindtsval s a program megrsval kezddik, hanem a tervezsi fzissal. Elsknt a program matematikai modelljt kell megalkotni, majd el kell kszteni a specifikcijt, s csak ezutn jn az a munkafolyamat, amely sorn a program szvegt begpeljk a szvegszerkesztbe.
Nzznk meg a funkcionlis nyelvek hasznlatra egy konkrt pldt gy, hogy az elsajttani kvnt nyelvek egyikt sem ismerjk. Legyen az els plda az n! kiszmtsa brmely n rtk mellett. Ez a problma annyira ltalnos, hogy szinte minden programozsi tanknyvben megtalljuk egy vltozatt.
1.1. programlista. Faktorilis fggvny - Erlang
factorial(0) -> 1; factorial(N) -> N * factorial(N-1).
Lthatjuk, hogy a forrskd, ami Erlang nyelven rdott igen egyszer, s nem sokban klnbzik a matematikai formulkkal definilt fggvnytl, ami az albbi mdon rhat le:
1.2. programlista. Faktorilis fggvny
fakt n = n*fakt n-1
Ez a lers, ha Clean nyelven rjuk le, mg inkbb hasonlt a matematikai formra.
1.3. programlista. Faktorilis fggvny Clean
fakt n = if (n==0) 1 (n * fakt (n-1))
A kvetkez hasznos tulajdonsg a kifejez er mellett az, hogy a rekurzi megvalstsa nagyon hatkony. Termszetesen kszthetnk rekurzv programokat imperatv nyelveken is, de ezeknek a vezrlsi szerkezeteknek nagy htrnya, hogy a rekurzv hvsok szma korltozott, ami azt jelenti, hogy tbb-kevesebb lps utn mindenkppen megllnak.
Ha a bzisfelttel nem lltja meg a rekurzit, akkor a program-verem teltdse mindenkppen meg fogja. Funkcionlis nyelvekben lehetsg van a rekurzi egy specilis vltozatnak a hasznlatra. Ez a konstrukci a tail-recursion, amely futsa nem fgg a program-veremtl, vagyis ha gy akarjuk, soha nem ll meg.
1.4. programlista. Farok-rekurzv hvsok
f()-> ... f(). g1() -> g1().
A konstrukci lnyege, hogy a rekurzv hvsok nem hasznljk a vermet (legalbbis nem a megszokott mdon). A verem kirtkel s grf tr rendszerek mindig a legutols rekurzv hvs eredmnyvel trnek vissza. A farok-rekurzi megvalsulsnak az a felttele, hogy a rekurzv fggvny utols utastsa a fggvny nmagra vonatkoz hvsa legyen, s ez a hvs ne szerepeljen kifejezsben (1.5. programlista).
1.5. programlista. Farok-rekurzv faktorilis fggvny - Erlang
fact(N) -> factr(N, 1). factr(0, X) -> X; factr(N, X) -> factr(N-1, N*X).
1.6. programlista. Farok-rekurzv faktorilis fggvny Clean
fact n = factr n 1 factr 0 x = x factr n x = factr (n-1) (n*x)
1.7. programlista. Farok-rekurzv faktorilis fggvny F#
let rec fakt n = match n with | 0 -> 1 | n -> n * fakt(n-1)
let rec fakt n = if n=0 then 1 else n * fakt (n-1)
A rekurzv programokat ltva s azt a tnyt figyelembe vve, hogy a rekurzi ersen korltozott futssal br, felmerlhet bennnk az a krds, hogy egyltaln mi szksg van r, hiszen a rekurzv programokhoz mindig tallhatunk velk ekvivalens iteratv megoldst. Ez az llts igaz, ha nem egy funkcionlis nyelvekrl szl tanknyvben lltjuk. A funkcionls nyelvekben nem, vagy csak nagyon ritka esetekben tallunk olyan - itercis lpsek megvalstsra szolgl - v