web viewfunkcionális nyelvek. király, roland. funkcionális nyelvek....

Click here to load reader

Post on 06-Mar-2019

215 views

Category:

Documents

0 download

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

View more