pp2-print.pdf

(231 KB) Pobierz
Paradygmaty programowania cz. II
Paradygmaty programowania cz. II
Marcin Szpyrka
Katedra Automatyki, AGH w Krakowie
Instytut Fizyki, UJK w Kielcach
2010/11
Marcin Szpyrka
Paradygmaty programowania cz. II
1/64
Literatura
[1] Joeren Fokker: Functional Programming. Department of Computer Science,
Utrecht University 1995 (pdf)
[2] Hal Daume III, et. al.: Yet Another Haskell Tutorial. 2004 (pdf)
[3] Kees Doets, Jan van Eijck: The Haskell Road to Logic, Math and Programming.
2004 (pdf)
[4] http://www.haskell.org
[5] http://www.haskell.org/ghc/docs/latest/html/users_guide/ghci.html
[6] http://www.haskell.org/bookshelf/index.html#tutorials
[7] http://www.haskell.org/haskellwiki/Tutorials#Best_places_to_start
Marcin Szpyrka
Paradygmaty programowania cz. II
2/64
394713828.006.png 394713828.007.png
Haskell – wprowadzenie
z Haskell jest nowoczesnym, leniwym, czysto-funkcyjnym jezykiem
programowania, nazwanym tak na czesc ameryka nskiego matematyka Haskella
Curry’ego.
z Termin leniwy oznacza, ze wartosc zadnego wyrazenia nie jest wyznaczana
dopóki nie jest potrzebna. – Umozliwia to na przykład stosowanie nieko ncz acej
sie rekurencji, przy czym wyznaczane s a tylko te wartosci, które s a aktualnie
potrzebne.
Dla porównania w jezykach scisłych (np. C, C++, Java itd.) wyznacza jest
wartosc kazdego wyrazenia, niezaleznie od tego czy jest to potrzebne, czy nie.
z Termin czysty oznacza, ze jest to jezyk bez efektów ubocznych. – Za efekty
uboczne wykonania funkcji uwazamy wszystkie operacje przez ni a
wykonywane nie zwi azane bezposrednio z obliczeniem jej wartosci, np.
wypisanie komunikatu na ekranie, modyfikacja globalnej zmiennej itp.
z Haskell jest jezykiem stosuj acym silne typowanie. – Niemozliwa jest na
przykład automatyczna (przypadkowa) konwersja Double do Int .
Ponadto w Haskellu typy s a automatycznie rozpoznawane, co oznacza, ze
bardzo rzadko konieczne jest deklarowanie typu funkcji.
z Haskell stosuje system monad do oddzielenia nieczystych operacji (np. operacji
wejscia-wyjscia) od reszty programu.
Marcin Szpyrka
Paradygmaty programowania cz. II
3/64
Kompilator, praca interaktywna
Do pracy z jezykiem Haskell bedziemy uzywac kompilator GHC – the Glasgow
Haskell Compilation system. W systemie GNU/Linux (Ubuntu) wymaga to instalacji
pakietu ghc6.
Kod napisany w jezyku Haskell moze byc wykonywany w trybie wsadowym
(kompilowanie) lub interaktywnym (interpretowanie).
Praca interaktywna – przykład sesji:
>$ ghci
GHCi, version 6.8.2: http://www.haskell.org/ghc/ :? for help
Loading package base ... linking ... done.
Prelude> "Haskell is fun"
"Haskell is fun"
Prelude> (23-17) * 2^7
768
Prelude> sqrt 3
1.7320508075688772
Prelude> let wielomian x = x^3 -2 * x + 3
Prelude> wielomian 4
59
Prelude> :q
Leaving GHCi.
>$
Marcin Szpyrka
Paradygmaty programowania cz. II
4/64
394713828.008.png
Podstawy programowania – funkcje
z Program w Haskellu składa sie z jednej lub wiecej funkcji. Podczas
wykonywania programu, funkcji dostarczane s a argumenty i wyznaczana jest jej
wartosc.
z W Haskellu rozrózniane s a małe i wielkie litery. Nazwy funkcji i parametrów
musz a zaczynac sie z małej litery. Ponadto dozwolone jest stosowanie liter, cyfr,
pojedynczego apostrofu i symbolu podkreslenia. Wyj atek stanowi a funkcje
konstruuj ace, których nazwy zaczynaj a sie z wielkiej litery. Ponato z wielkiej
litery piszemy nazwy typów.
z Funkcje mozna definiowac bezposrednio podczas sesji interaktywnej stosuj ac
polecenie let .
z Zazwyczaj definicje funkcji umieszczane s a w plikach o rozszerzeniu hs.
Podczas pracy z interpreterem, definicje zawarte w pliku wczytuje sie stosuj ac
polecenie :load (skrót :l ), którego parametrem jest nazwa wczytywanego
pliku. Ponowne wczytanie ostatnio załadowanego pliku (np. po zmianach jego
zawartosci) realizowane jest przez polecenie :reload (skrót :r ).
z W Haskellu nie wystepuj a zmienne. Mozna definiowac funkcje
bezargumentowe, np.: e = 2.718282 , które mozna traktowac jak stałe.
z W programach pisanych w Haskellu dostepne s a bezposrednio funkcje
i operatory (jest ich w sumie ponad 200) zdefiniowane w pliku prelude.hs.
Marcin Szpyrka
Paradygmaty programowania cz. II
5/64
Podstawy programowania – przykład
1 -- plik kolo.hs
2
3 module Kolo
4 where
5
6 {- nie podajemy tutaj definicji funkcji pi.
7 bo jest ona zdefiniowana w pliku prelude.hs -}
8
9 obwod r = 2 * pi * r
10
11 pole r = pi * r ^ 2
z Pliki z kodem mog a zawierac dwa typy komentarzy: jednoliniowe zaczynaj ace
sie od znaku -- oraz wieloliniowe umieszczone miedzy znakami {- i -} .
z W przypadku przedstawionych funkcji ich definicja składa sie z: nazwy funkcji,
nazwy parametru formalnego (obie funkcje s a jednoargumentowe), znaku =
oddzielaj acego dwie czesci definicji i wyrazenia okreslaj acego jak nalezy
wyznaczyc wartosc funkcji.
Prelude> :l kolo
[1 of 1] Compiling Kolo
( kolo.hs, interpreted )
Ok, modules loaded: Kolo.
* Kolo> pole 2
12.566370614359172
* Kolo>
Marcin Szpyrka
Paradygmaty programowania cz. II
6/64
394713828.009.png
Instrukcje warunkowe
1 sgn x = if x < 0 then -1
2 elseif x > 0 then 1
3 else 0
4
5 -- sgn (-9)
W Haskellu instrukcja if musi zawierac klauzule else .
1 f x =
2 case x of
3
0 -> 1
4
1 -> 5
5
2 -> 2
6
_ -> -1
Znak podkreslenia pełni w powyzszej definicji role dzokera – zastepuje dowoln a inn a
wartosc. Do wcinania kodu nalezy uzywac spacji, a nie znaków tabulacji.
Zastosowane wciecia maj a znaczenie dla interpretacji kodu.
Marcin Szpyrka
Paradygmaty programowania cz. II
7/64
Haskell – organizacja kodu
Układ kodu w Haskellu ma istotne znaczenie dla jego interpretacji. Obowi azuje tutaj
nastepuj aca zasada:
Otwieraj aca klamra jest domyslnie wstawiana po słowach kluczowych: where, let, do
oraz of i zapamietywana jest pozycja od której rozpoczyna sie kolejne polecenie. Od
tego momentu kazda linia o takim samym wcieciu ko nczy sie domyslnie srednikiem.
Jezeli wciecie kolejnej linii jest mniejsze, to wczesniej automatycznie jest wstawiana
klamra zamykaj aca.
Zasade te mozna pomin ac, jesli jawnie bedziemy wpisywac sredniki i klamry.
W takim przypadku układ kodu nie ma juz znaczenia.
1 f x = case x of { 0 -> 1; 1 -> 5; 2 -> 2; _ -> -1}
2
3 -- lub
4
5 f x = case x of { 0 -> 1;
6 1 -> 5; 2 -> 2
7 ; _ -> -1}
Marcin Szpyrka
Paradygmaty programowania cz. II
8/64
394713828.001.png 394713828.002.png
Definiowanie funkcji przez okreslanie przypadków
1 sgn x | x > 0 = 1
2
| x == 0 = 0
| x < 0 = -1
3
4
5 f x | x < 0 = x ^2
6
| otherwise = x
z Zastosowanie poszczególnych przypadków jest okreslane przez zastrzezenia
umieszczane bezposrednio po znaku |.
z Przypadki s a przegl adane od góry do dołu. Stosowany jest pierwszy napotkany
przypadek, dla którego zastrzezenie ma wartosc True.
z Jako zastrzezenie dla ostatniego przypadku mozna uzyc wartosci True lub stałej
otherwise.
1 g x | x <= 0 = 0
2
| x > 0 = 2 * x
| x > 3 = x ^3
3
UWAGA:Definicja funkcji g jest poprawna składniowo, ale przypadek x > 3 nigdy
nie zostanie uzyty.
Marcin Szpyrka
Paradygmaty programowania cz. II
9/64
Definiowanie funkcji przez czesci
1 f 0 = 1
2 f 1 = 5
3 f 2 = 2
4 f _ = -1
Funkcje mozna definiowac podaj ac poszczególne czesci jej definicji dla róznych
wartosci argumentu. Podobnie jak przy okreslaniu przypadków, równiez tutaj istotna
jest kolejnosc w jakiej ułozone zostan a poszczególne definicje.
UWAGA:Jezeli nie zostanie podana definicja z linii (4), to kompilator bedzie
zgłaszał bł ad dla argumentów innych niz 0, 1 i 2.
1 nie True = False
2 nie False = True
3
4 i TrueTrue = True
5 i _ _
= False
6
7 lub True _ = True
8 lub _ True = True
9 lub _ _ = False
Marcin Szpyrka
Paradygmaty programowania cz. II
10/64
394713828.003.png 394713828.004.png 394713828.005.png
Zgłoś jeśli naruszono regulamin