Paradygmaty programowania

Podobne dokumenty
Paradygmaty programowania

Podstawy programowania funkcjonalnego

Elementy języka Scheme

Programowanie funkcyjne wprowadzenie Specyfikacje formalne i programy funkcyjne

Definicje wyższego poziomu

Języki programowania deklaratywnego

Elementy języka Scheme

Programowanie Funkcyjne. Marcin Kubica Świder,

Algorytm. a programowanie -

Wstęp do Programowania potok funkcyjny

Wstęp do Programowania Obiektowego. Wykład 13 Paradygmaty. Składnia i semantyka.

Programowanie - wykład 4

ForPascal Interpreter języka Pascal

Myśl w języku Python! : nauka programowania / Allen B. Downey. Gliwice, cop Spis treści

Wstęp do Programowania potok funkcyjny

REKURENCJA W JĘZYKU HASKELL. Autor: Walczak Michał

Języki i paradygmaty programowania. I. Wprowadzenie

1 Podstawy c++ w pigułce.

Laboratorium nr 5. Temat: Funkcje agregujące, klauzule GROUP BY, HAVING

Programowanie funkcyjne (Haskell Wprowadzenie) Kowalik Adrian

1 Podstawy c++ w pigułce.

Programowanie obiektowo zorientowane. Mirosław Głowacki Wykład w języku C++

Programowanie w języku C++ Podstawowe paradygmaty programowania

4. Funkcje. Przykłady

Język programowania DELPHI / Andrzej Marciniak. Poznań, Spis treści

Składnia funkcji i Rekurencja w języku Haskell

Instrukcja warunkowa i złoŝona.

Podstawy programowania. Wykład: 4. Instrukcje sterujące, operatory. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

PoniŜej znajdują się pytania z egzaminów zawodowych teoretycznych. Jest to materiał poglądowy.

Języki programowania zasady ich tworzenia

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Cw.12 JAVAScript w dokumentach HTML

Języki programowania C i C++ Wykład: Typy zmiennych c.d. Operatory Funkcje. dr Artur Bartoszewski - Języki C i C++, sem.

Język JAVA podstawy. Wykład 3, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Pascal - wprowadzenie

Programowanie deklaratywne

Definicje. Algorytm to:

Podstawy informatyki. Informatyka stosowana - studia niestacjonarne. Grzegorz Smyk

Programowanie w Logice Przykłady programów. Przemysław Kobylański

Języki skryptowe w programie Plans

WYRAŻENIA ALGEBRAICZNE

Informacja o języku. Osadzanie skryptów. Instrukcje, komentarze, zmienne, typy, stałe. Operatory. Struktury kontrolne. Tablice.

METODY KOMPUTEROWE W OBLICZENIACH INŻYNIERSKICH

Laboratorium Programowanie Obrabiarek CNC. Nr H7

Wstęp do Programowania potok funkcyjny

Programowanie strukturalne. Opis ogólny programu w Turbo Pascalu

Wstęp do programowania

Instrukcje warunkowe i skoku. Spotkanie 2. Wyrażenia i operatory logiczne. Instrukcje warunkowe: if else, switch.

Podstawy programowania. Wykład 7 Tablice wielowymiarowe, SOA, AOS, itp. Krzysztof Banaś Podstawy programowania 1

λ parametry. wartość funkcji suma = λ x y. x + y kwadrat = λ x. x * x K.M. Ocetkiewicz, 2008 WETI, PG 2 K.M. Ocetkiewicz, 2008 WETI, PG 3

Wstęp do Programowania potok funkcyjny

ALGORYTMY I STRUKTURY DANYCH

Podstawy Programowania Algorytmy i programowanie

Interpreter - EasyCompile

Podstawy programowania 2. Temat: Funkcje i procedury rekurencyjne. Przygotował: mgr inż. Tomasz Michno

METODY OPISU ALGORYTMÓW KOMPUTEROWYCH

Lab 10. Funkcje w argumentach funkcji metoda Newtona. Synonimy nazw typów danych. Struktury. Tablice struktur.

Podstawy Programowania C++

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Liczby losowe i pętla while w języku Python

Informacje wstępne #include <nazwa> - derektywa procesora umożliwiająca włączenie do programu pliku o podanej nazwie. Typy danych: char, signed char

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6

Język C, tablice i funkcje (laboratorium, EE1-DI)

WHILE (wyrażenie) instrukcja;

Naukę zaczynamy od poznania interpretera. Interpreter uruchamiamy z konsoli poleceniem

Projekt 4: Programowanie w logice

I. KARTA PRZEDMIOTU CEL PRZEDMIOTU WYMAGANIA WSTĘPNE W ZAKRESIE WIEDZY, UMIEJĘTNOŚCI I INNYCH KOMPETENCJI EFEKTY KSZTAŁCENIA

JAVAScript w dokumentach HTML (1)

1 Wprowadzenie do algorytmiki

JAVAScript w dokumentach HTML - przypomnienie

PODSTAWY SZTUCZNEJ INTELIGENCJI

Programowanie. programowania. Klasa 3 Lekcja 9 PASCAL & C++

Podstawy Programowania Podstawowa składnia języka C++

ALGORYTMY Algorytm poprawny jednoznaczny szczegółowy uniwersalny skończoność efektywność (sprawność) zmiennych liniowy warunkowy iteracyjny

Technologie informacyjne - wykład 12 -

Programowanie funkcyjne Wykład 13. Siła wyrazu rachunku lambda

Bloki anonimowe w PL/SQL

Operacje wykonywane są na operandach (argumentach operatorów). Przy operacji dodawania: argumentami operatora dodawania + są dwa operandy 2 i 5.

Laboratorium nr 8. Temat: Podstawy języka zapytań SQL (część 2)

- nawiasy kwadratowe oznaczają, że to lista

Języki i Paradygmaty Programowania

Python wprowadzenie. Warszawa, 24 marca PROGRAMOWANIE I SZKOLENIA

1. Informatyka - dyscyplina naukowa i techniczna zajmująca się przetwarzaniem informacji.

Język skryptowy: Laboratorium 1. Wprowadzenie do języka Python

Zmienne powłoki. Wywołanie wartości następuje poprzez umieszczenie przed nazwą zmiennej znaku dolara ($ZMIENNA), np. ZMIENNA=wartosc.

Typy, klasy typów, składnie w funkcji

Redis, skrypty w języku Lua

Języki formalne i techniki translacji

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;

Zapis algorytmów: schematy blokowe i pseudokod 1

Programowanie obiektowe

PARADYGMATY PROGRAMOWANIA Wykład 4

Podstawy programowania. 1. Operacje arytmetyczne Operacja arytmetyczna jest opisywana za pomocą znaku operacji i jednego lub dwóch wyrażeń.

KOTLIN. Język programowania dla Androida

Gramatyki atrybutywne

Obliczenia na stosie. Wykład 9. Obliczenia na stosie. J. Cichoń, P. Kobylański Wstęp do Informatyki i Programowania 266 / 303

Programowanie w Baltie klasa VII

Wykresy i interfejsy użytkownika

Programowanie w języku Swift : Big Nerd Ranch guide / Matthew Mathias, John Gallagher. Gliwice, cop Spis treści

Podstawy programowania skrót z wykładów:

Transkrypt:

Paradygmaty programowania Paradygmat funkcyjny Cezary Bolek Katedra Informatyki UŁ 1 Dlaczego programowanie funkcyjne? Języki imperatywne, a w duŝym stopniu takŝe obiektowe, są bardzo silnie związane z architekturą von Neumanna. WiąŜe się to z pojęciem stanu maszyny, któremu w językach tych odpowiadają zmienne i dane w obiektach. Jedno z podejść do programowania wiąŝe się z opinią, Ŝe związek z architekturą von Neumanna narzuca niepotrzebne ograniczenia na proces tworzenia oprogramowania. W zamian za to moŝna przyjąć paradygmat oparty na pojęciu funkcji w znaczeniu takim, jakie od lat przyjmuje się w matematyce. Paradygmaty programowania Cezary Bolek 2 Popularność programowania funkcyjnego W środowisku komercyjnych twórców oprogramowania języki funkcyjne nie są zbytnio rozpowszechnione z pewnymi wyjątkami. Istnieje przykładowo Lisp. Jest to jeden z języków funkcyjnych, który doczekał się sporej popularności. Uproszczonym i uporządkowanym dialektem Lispu jest Scheme. W środowiskach akademickich znane i cenione są takŝe np. języki ML wraz z pochodnymi i Haskell. Słyną m.in. ze swojego silnego typowania. Oprócz tego dość silną pozycję mają pewne języki niszowe, np. Erlang (w telekomunikacji i K (w obliczeniach finansowych. Paradygmaty programowania Cezary Bolek 3

Cechy charakterystyczne Nie ma pamięci, a zatem nie ma zmiennych modelujących komórki pamięci. Nie ma teŝ więc stanu funkcji. A więc nie ma efektów ubocznych... Nie ma ciągów instrukcji i iteracji, a jedynie rekurencja i wyraŝenia warunkowe. Innymi słowy, funkcja (w sensie matematycznym definiuje wartość, ale nie określa ciągu działań na wartościach w pamięci, które mogłyby ją wytworzyć. Parametr funkcji reprezentuje dowolny element z dziedziny, lecz w trakcie obliczania jest ustalony Paradygmaty programowania Cezary Bolek 4 Rachunek Lambda WaŜnym elementem podstaw matematycznych dla programowania funkcyjnego jest rachunek lambda. Wymyślony przez Alonsa Churcha w roku 1941, Pozwala m.in. zdefiniować funkcję bez nadawania jej nazwy. W klasycznym zapisie matematycznym definiując funkcję, nadaje się jej z konieczności nazwę, np.: f ( n = n f ( n 1 Natomiast wyraŝenie lambda ( λ -wyraŝenie utoŝsamiane jest z samą funkcją, np.: λ x. x - funkcja obliczająca kwadrat danego parametru. 2 Paradygmaty programowania Cezary Bolek 5 Rachunek Lambda λ -wyraŝenie zawiera: symbol λ, parametry funkcji, kropkę i wyraŝenie opisujące wartość funkcji; Niekiedy zamiast kropki stosuje się nawiasy obejmujące parametry, np. 2 λ( x x WyraŜenie takie moŝna zastosować do parametru, pisząc parametr za owym wyraŝeniem, np.: (λ x. x 2 2 (3 = 3 = 9 Paradygmaty programowania Cezary Bolek 6

Cel stosowania języków funkcyjnych Naśladowanie funkcji matematycznych (Czysty język funkcyjny nie ma zmiennych programista nie musi się więc martwić o pamięć. Ponadto: Konstrukcje iteracyjne (np. pętla while nie są moŝliwe bez zmiennych, trzeba stosować rekurencję Wykonanie programu funkcyjnego nie ma stanu w sensie semantyki operacyjnej lub denotacyjnej. Dla tych samych parametrów wykonanie funkcji zawsze daje ten samy wynik. Określane jest to mianem przeźroczystością odniesień Paradygmaty programowania Cezary Bolek 7 Składniki języka funkcyjnego Zbiór funkcji pierwotnych. Zbiór funkcjonałów pozwalających konstruować złoŝone funkcje z funkcji pierwotnych. Operacja aplikowania funkcji do argumentu. Pewne struktury do reprezentowania parametrów i obliczonych wyników. Paradygmaty programowania Cezary Bolek 8 Przegląd języków funkcyjnych Paradygmaty programowania Cezary Bolek 9

Lisp Najstarszy język funkcyjny. Prace projektowe rozpoczęły się pod koniec lat 50-tych XX wieku. Pierwotnie jego nazwę pisano duŝymi literami: LISP. Ewoluował, choć obecne koncepcje języków funkcyjnych są nieco inne. W historii istniało wiele dialektów Lispu obecnie do najpopularniejszych naleŝą dwa: Common Lisp i Scheme Paradygmaty programowania Cezary Bolek 10 Lisp obiekty danych W oryginalnym Lispie są tylko dwa moŝliwe obiekty: atomy i listy Nie są to typy w sensie języka imperatywnego Atomy to symbole (w postaci identyfikatorów lub stałe liczbowe Listy określa się przez wyszczególnienie elementów w nawiasach Listy mogą być zagnieŝdŝane Listę pustą zapisuje się jako ( Paradygmaty programowania Cezary Bolek 11 Lisp: S-wyraŜenia (Symbolic Expression Wywołania funkcji zapisywane są w Odwrotnej Notacji Polskiej, w postaci: (nazwafunkcji arg 1... arg n Definicje funkcji zapisuje się w notacji lambda, w postaci: (nazwafunkcji (LAMBDA (arg 1... arg n wyraŝenie Pierwotnie S-wyraŜeniami nazywano określone w powyŝszy sposób funkcje. Później nazwą tą objęto wszystkie struktury w Lispie dane i kod. WaŜna cecha Lispu: dane (listy i kod (wywołania funkcji mają taką samą postać. Daje to m.in. moŝliwość dynamicznego tworzenia kodu. Paradygmaty programowania Cezary Bolek 12

Lisp - nawiasy S-wyraŜenia implikują stosowanie wielu zagnieŝdŝonych konstrukcji opartych na nawiasach Sposób uŝycia nawiasów jest najlepiej widocznym na pierwszy rzut oka faktem pozwalający odróŝnić Lisp od innych rodzin języków Z tego powodu Lisp był często krytykowany, głównie przez programistów innych języków JednakŜe składnia oparta na S-wyraŜeniach leŝy u podstaw moŝliwości Lispu; jest niezwykle regularna, co ułatwia jej przetwarzanie przez komputer Paradygmaty programowania Cezary Bolek 13 Scheme Scheme jest odmianą Lispu. Pojawił się w połowie lat 70-tych XX wieku Jest niewielki w porównaniu z oryginalnym Lispem. Stosuje zakresy statyczne Funkcje mogą być wartościami wyraŝeń i elementami list; mogą być przekazywane jako parametry Interpreter Scheme u Ma postać nieskończonej pętli, która czyta wyraŝenie, interpretuje je i wyświetla wynik WyraŜenia są interpretowane przez funkcję EVAL Paradygmaty programowania Cezary Bolek 14 Scheme pierwotne funkcje liczbowe Są wśród nich podstawowe działania arytmetyczne Biorą dowolną liczbę argumentów, np. + dodaje wszystkie argumenty do siebie, od pierwszego argumentu odejmuje pozostałe Przy wywołaniu bez argumentów zwracają odpowiedni element neutralny 0 dla dodawania, 1 dla mnoŝenia. itp. Oprócz tego są istnieją: ABS (wartość bezwzględna, SQRT (pierwiastkowanie, REMAINDER (reszta z dzielenia, MIN, MAX inne... Paradygmaty programowania Cezary Bolek 15

Scheme definiowanie funkcji Program to zbiór definicji funkcji MoŜna uŝywać funkcji bez nazw, np. (LAMBDA (x (* x x Zatem poniŝsze wywołanie wyświetli wynik 36: ((LAMBDA (x (* x x 6 W powyŝszym λ-wyraŝeniu x jest zmienną związaną MoŜna związać nazwę z wartością lub z λ-wyraŝeniem za pomocą specjalnej funkcji DEFINE. W pierwszym przypadku powstają nazwane stałe (nie zmienne!, np. (DEFINE pi 3.1415926 W drugim przypadku, jako parametry potrzebne są dwie listy: prototyp funkcji i wyraŝenie (lub wyraŝenia, z którymi nazwa jest wiązana. W tym przypadku pomija się słowo LAMBDA, np. (DEFINE (square x (* x x Parametry przekazywane są przez wartość. Paradygmaty programowania Cezary Bolek 16 Scheme funkcje do obsługi wyjścia Typowy sposób wyprowadzenia wyników programu to po prostu wyjście z interpretera, czyli wynik aplikacji funkcji EVAL do funkcji w programie Istnieje takŝe imperatywna funkcja wyjściowa, która wyświetla podane wyraŝenie (jest to właściwie jej efekt uboczny... (DISPLAY wyraŝenie Druga funkcja imperatywna to (NEWLINE Paradygmaty programowania Cezary Bolek 17 Scheme - predykaty działające na liczbach Predykaty to wyraŝenia, które mają za zadanie zwracać logiczną wartość zapytania które reprezentują w zaleŝności od podanych parametrów Dostępne są predykaty: =, <>, >, <, >=, <= EVEN? sprawdza, czy podana wartość liczbowa jest parzysta ODD? sprawdza, czy nieparzysta ZERO? sprawdza, czy wartość jest zerem NEGETIVE? sprawdza, czy podana wartość jest ujemna Wartości logiczne są zapisywane jako #F i #T Lista pusta ( interpretowana jest jako #F, a dowolna lista niepusta jako #T. Paradygmaty programowania Cezary Bolek 18

Scheme struktury sterujące Dwie struktury słuŝące do sterowania. Wybór jeden z dwóch zapisuje się w postaci: (IF predykat wyraŝeniet wyraŝenief Wybór jeden z wielu zapisuje się w postaci: (COND (predykat1 wyraŝenie1 (predykat2 wyraŝenie2... (predykatn wyraŝenien (ELSE wyraŝeniee Przykład: Definicja funkcji obliczającej silnię: (DEFINE (silnia n (IF (= n 0 1 (* n (silnia ( n 1 Paradygmaty programowania Cezary Bolek 19 Scheme funkcje listowe QUOTE zwraca swój parametr bez jakichkolwiek zmian (czyli bez obliczania go jako funkcji; w tej roli moŝna teŝ uŝyć jednego apostrofu, np. (QUOTE (A B C jest równowaŝne z (A B C, czyli lista (A B C Funkcja ta jest potrzebna, gdy istnieje potrzeba np. potraktowania listy jako czystych danych, a nie jako wywołanie funkcji z parametrami. UŜycie nie zacytowanej listy (A B C skutkowałoby próbą policzenia funkcji A na argumentach B i C. CAR zwraca pierwszy element (głowę podanej listy, np. (CAR (A B C zwraca A. Wywołanie CAR dla pustej listy lub atomu jest błędem. CDR zwraca część listy pozostałą po usunięciu głowy (ogon, np. (CDR (A B C zwraca (B C. Paradygmaty programowania Cezary Bolek 20 Scheme inne funkcje listowe i predykaty CONS tworzy listę z podanej głowy i ogona, tzn. wstawia pierwszy parametr jako nową głowę w liście będącej drugim parametrem, np (CONS A (B C zwraca (A B C (CONS (A B (C D zwraca ((A B C D LIST tworzy listę z dowolnej liczby parametrów. Jest to skrótowa forma o takim samym znaczeniu jak zagnieŝdŝone wywołania CONS Predykaty EQ? zwraca #T, jeśli obydwa parametry są atomami i są równe LIST? zwraca #T, jeśli parametr jest listą NULL? zwraca #T, jeśli parametr jest listą pustą Paradygmaty programowania Cezary Bolek 21

Lisp - przykład Funkcja sprawdzająca, czy atom (podany jak pierwszy parametr jest elementem listy (podanej jako drugi parametr. (DEFINE (member atm lst (COND ((NULL? lst ( ((EQ? atm (CAR lst #T (ELSE (member atm (CDR lst #;> (member 'a '(a b c Paradygmaty programowania Cezary Bolek 22 Scheme składanie funkcji Był to jedyny pierwotny funkcjonał w pierwotnym Lispie. Działanie: Wszelkie listy (nie cytowane za pomocą QUOTE bądź apostrofu są traktowane jako wywołania funkcji Najpierw są wyliczane ich parametry Odnosi się to rekurencyjnie do list zagnieŝdŝonych w listach Jest to w istocie właśnie składanie funkcji Przykład: CDR (CDR (A B C zwraca (C Paradygmaty programowania Cezary Bolek 23 Scheme składanie funkcji (przykład Operator aplikacji (zastosowania funkcji do wszystkich elementów listy zbiorowej moŝna zdefiniować następująco: (DEFINE (mapcar fun lst (COND ((NULL? lst ( (ELSE (CONS (fun (CAR lst (mapcar fun (CDR lst #;> (mapcar sin '(-1 0 1 (-0.8414709848078965 0.0 0.8414709848078965 Paradygmaty programowania Cezary Bolek 24

Scheme funkcje tworzące kod Program i dane w Scheme mają taką samą strukturę To powoduje, Ŝe moŝna z łatwością dynamicznie budować kod Przykład: Przypuśćmy, Ŝe mamy listę atomów liczbowych i chcemy policzyć ich sumę. ZauwaŜmy, Ŝe operatora + nie moŝna zastosować bezpośrednio, gdyŝ wymaga on jako parametrów atomów, a nie listy. Istnieją dwie istotnie róŝne moŝliwości. Paradygmaty programowania Cezary Bolek 25 Scheme funkcje tworzące kod (przykład Wariant 1: funkcja, która dodaje po kolei wszystkie atomy (DEFINE (sumator lst (COND ((NULL? lst 0 (ELSE (+ (CAR lst (sumator (CDR lst Wariant 2: zbudowanie odpowiedniego wywołania dla operatora + za pomocą CONS i policzenie go poprzez wywołanie funkcji EVAL: (DEFINE (sumator lst (COND ((NULL? lst 0 (ELSE (EVAL (CONS + lst #;> (sumator1 '(1 2 3 4 26 Scheme wiązanie nazwy a wartością Funkcja LET Składnia wywołania jest następująca: (LET ( (nazwa1 wyraŝenie1 (nazwa2 wyraŝenie2... (nazwan wyraŝenien ciało Wywołanie powoduje związanie podanych nazw z odpowiednimi wyraŝeniami oraz obliczenie ciała Funkcja LET jest przydatna jako pewien sposób modularyzacji obliczeń Paradygmaty programowania Cezary Bolek 27

Scheme funkcja LET (przykład Funkcja obliczająca iloraz sum dwóch list. Zwraca 0, jeśli druga suma (dzielnik jest zerem (DEFINE (iloraz x y (LET ( (licznik (sumator x (mianownik (sumator y (IF (ZERO? mianownik 0 (/ licznik mianownik #;> (iloraz '(-1 2 3 '(4-5 6 4/5 Paradygmaty programowania Cezary Bolek 28 Język ML ML to język, który w swoim czasie był typowym akademickim przykładem języka funkcyjnego Stosuje zakresy statyczne. Jest silnie typowany, bez niejawnych konwersji, za to stosuje niejawne nadawanie typów. WyraŜenia arytmetyczne zapisywane w tradycyjnej postaci infiksowej. Zawiera obsługę wyjątków. Paradygmaty programowania Cezary Bolek 29 ML funkcje Deklaracje mają postać fun nazwa (parametry = ciało; Przykładowo: fun square (x: int: int = x * x; Funkcje zawierające działania arytmetyczne nie mogą być polimorficzne Funkcje zawierające tylko operacje na listach, operatory n-tek i porównania (= oraz <> mogą być polimorficzne Paradygmaty programowania Cezary Bolek 30

ML funkcje MoŜna stosować konstrukcję if-then-else, np. fun fact(n: int: int = if n = 0 then 1 else n * fact(n 1; Alternatywą jest stosowane często dopasowywanie do wzorca, np. fun fact(0 = 1 fact(n: int: int = n * fact(n 1; Paradygmaty programowania Cezary Bolek 31 ML listy Listy zapisywane są w nawiasach kwadratowych, np. [3, 2, 7] Lista pusta zapisywana jest jako [] lub nil Konstruktor listowy (odpowiednik CONS ::, np. 1 :: [3, 2, 7] daje [1, 3, 2, 7] Elementy listy muszą być tego samego typu Funkcje wydzielające głowę i ogon (odpowiedniki CAR i CDR: to hd oraz tl Operator :: moŝe być uŝywany w dopasowaniach do wzorca, np.: fun length([] = 0 length(h :: t = 1 + length(t; Paradygmaty programowania Cezary Bolek 32 ML przykład Funkcja łącząca dwie listy. Zrealizowana jako rekurencyjna, z dopasowywaniem za pomocą operatora :: fun append([], lst = lst append(h :: t, lst = h :: append(t, lst; Paradygmaty programowania Cezary Bolek 33

Haskell Podobnie jak ML, stosuje zakresy statyczne Jest silnie typowany Stosuje obliczanie leniwe, tzn. nie oblicza podwyraŝeń, dopóki nie jest to konieczne Zawiera ciekawe operacje listotwórcze Czysto funkcyjny, bez efektów ubocznych. Paradygmaty programowania Cezary Bolek 34 Haskell funkcje Definicje funkcji są postaci np. fact 0 = 1 fact n = n * fact (n 1 W powyŝszym przykładzie stosowane jest dopasowywanie. Alternatywnie moŝna uŝyć dozorów, np. fact n n == 0 = 1 n > 0 = n * fact (n 1 PowyŜsza forma to wyraŝenie warunkowe. MoŜe zawierać część opatrzoną klauzulą otherwise, obliczaną wówczas, gdy wszystkie dozory są fałszywe. Paradygmaty programowania Cezary Bolek 35 Haskell listy Listy zapisywane są w nawiasach kwadratowych, np. [3, 2, 7] Lista pusta zapisywana jest jako [] Listy moŝna łączyć za pomocą operatora ++, np. [1, 3] ++ [2,7] daje [1, 3, 2, 7] Operator # podaje długość listy Za pomocą operatora.. moŝna określać ciągi arytmetyczne, np. [1..5] daje [1, 2, 3, 4, 5] [3, 6..15] daje [3, 6, 9, 12, 15] Paradygmaty programowania Cezary Bolek 36

Haskell listy Konstruktor listowy (odpowiednik CONS - : np. 1 : [3, 2, 7] daje [1, 3, 2, 7] Operator : moŝe być uŝywany w dopasowaniach, np.: iloczyn [] = 1 iloczyn (a : x = a * iloczyn x Paradygmaty programowania Cezary Bolek 37 Haskell operacje listotwórcze Jest to metoda opisu list, które reprezentują zbiory. Ogólna postać: [ wyraŝenie kwalifikator ] Przykładowo: [ n * n n [1..20] ] definiuje listę kwadratów liczb od 1 do 20. Innymi słowy lista wszystkich n*n po n z zakresu od 1 do 20 Kwalifikatorem moŝe być generator (jak w powyŝszym przykładzie lub warunek, np.: dzielniki n = [ i i <- [1..n div 2], n mod i == 0] Przykład implementacja sortowania szybkiego: sort [] = [] sort (h:t = sort [b b<-t, b<=h] ++ [h] ++ sort [b b<-t, b>h] Paradygmaty programowania Cezary Bolek 38 Haskell obliczanie leniwe Parametry funkcji obliczane są tylko wtedy, gdy jest to potrzebne do obliczenia owej funkcji Jeśli funkcja ma np. dwa parametry, a w konkretnym wywołaniu pierwszy parametr nie jest potrzebny w obliczeniach, odpowiedni parametr aktualny nie będzie obliczany Jeśli potrzebna jest tylko część parametru, tylko ta część zostanie obliczona Pozwala to definiować i stosować struktury nieskończone Struktury takie nie są faktycznie tworzone, lecz mogą być wykorzystane w leniwych obliczeniach Trzeba oczywiście uwaŝać, by nie zmusić Haskella do nieskończonych obliczeń Paradygmaty programowania Cezary Bolek 39