PARADYGMATY I JĘZYKI PROGRAMOWANIA. Haskell. (w11)



Podobne dokumenty
Elementy języka Haskell

Języki programowania Haskell

Programowanie Funkcyjne. Marcin Kubica Świder,

Języki i Paradygmaty Programowania

λ 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

Programowanie funkcyjne (Haskell Wprowadzenie) Kowalik Adrian

Wstęp do Programowania potok funkcyjny

- nawiasy kwadratowe oznaczają, że to lista

Podstawy programowania funkcjonalnego

Wstęp do programowania

Programowanie funkcyjne wprowadzenie Specyfikacje formalne i programy funkcyjne

Haskell Moduły Ładowanie

Paradygmaty programowania

Prezentacja o Haskell u(rozdział 3 i 4)

Programowanie strukturalne. Opis ogólny programu w Turbo Pascalu

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

WEJŚCIE/WYJŚCIE HASKELL ŁUKASZ PAWLAK DARIUSZ KRYSIAK

Informatyka 1. Wyrażenia i instrukcje, złożoność obliczeniowa

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Język ludzki kod maszynowy

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

Wstęp do programowania. Różne różności

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

Wstęp do Programowania, laboratorium 02

Składnia funkcji i Rekurencja w języku Haskell

PARADYGMATY PROGRAMOWANIA Wykład 4

Kurs rozszerzony języka Python

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

Zatem w jaki sposób nasze programy mają komunikować się ze światem zewnętrznym?

Paradygmaty programowania

Semantyka i Weryfikacja Programów - Laboratorium 3

Programowanie - instrukcje sterujące

Programowanie Komputerów

IX. Wskaźniki.(3 godz.)

Programowanie w języku C++ Podstawowe paradygmaty programowania

Wstęp do programowania

Ćwiczenia z wyliczania wartości funkcji

Technologie cyfrowe semestr letni 2018/2019

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy WSKAŹNIKI KLASOWE

C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów

C++ wprowadzanie zmiennych

Technologie cyfrowe semestr letni 2018/2019

Programowanie. Lista zadań nr 15. Na ćwiczenia 11, 19 i 23 czerwca 2008

Programowanie i projektowanie obiektowe

Podstawy programowania 2. Temat: Drzewa binarne. Przygotował: mgr inż. Tomasz Michno

Wstęp do programowania

4. Funkcje. Przykłady

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

Języki i metody programowania

Informatyka 1. Przetwarzanie tekstów

ALGORYTMY I STRUKTURY DANYCH

Bloki anonimowe w PL/SQL

Pętle i tablice. Spotkanie 3. Pętle: for, while, do while. Tablice. Przykłady

Podstawy programowania w Pythonie

Programowanie obiektowe

Wstęp do Programowania potok funkcyjny

Bash - wprowadzenie. Bash - wprowadzenie 1/39

TWORZENIE SWOICH TYPÓW I TYPÓW KLAS HASKELL (RODZIAŁ 8) ZAJĘCIA 4

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

Wstęp do programowania

Programowanie Delphi obliczenia, schematy blokowe

Odczyt danych z klawiatury Operatory w Javie

Algorytmika i Programowanie VBA 1 - podstawy

Elżbieta Kula - wprowadzenie do Turbo Pascala i algorytmiki

Pliki wykład 2. Dorota Pylak

Język programowania zbiór reguł określających, które ciągi symboli tworzą program komputerowy oraz jakie obliczenia opisuje ten program.

Wykład 15. Literatura. Kompilatory. Elementarne różnice. Preprocesor. Słowa kluczowe

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

Programowanie w C++ Wykład 3. Katarzyna Grzelak. 12 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 35

Haskell. Rozdział Ogólne informacje o języku

Funkcje w PL/SQL Funkcja to nazwany blok języka PL/SQL. Jest przechowywana w bazie i musi zwracać wynik. Z reguły, funkcji utworzonych w PL/SQL-u

Instrukcje pętli przykłady. Odgadywanie hasła. 1) Program pyta o hasło i podaje adres, gdy hasło poprawne lub komunikat o błędnym haśle.

Laboratorium 03: Podstawowe konstrukcje w języku Java [2h]

Wstęp do Programowania potok funkcyjny

Metody Metody, parametry, zwracanie wartości

Programowanie - wykład 4

Wstęp do Programowania potok funkcyjny

MATERIAŁY DO ZAJĘĆ II

C++ Przeładowanie operatorów i wzorce w klasach

Wykład 9 Funktory (moduły sparametryzowane)

Języki i paradygmaty programowania

PARADYGMATY PROGRAMOWANIA Wykład 3

Programowanie, algorytmy i struktury danych

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

Podstawy i języki programowania

Programowanie strukturalne i obiektowe. Funkcje

Python. Wprowadzenie. Jolanta Bachan

Wstęp do programowania obiektowego, wykład 7

wykład II uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - funkcje, tablice i wskaźniki wykład II dr Jarosław Mederski Spis

Pliki wykład 2. Dorota Pylak

1 Wskaźniki i zmienne dynamiczne, instrukcja przed zajęciami

JAVA. Platforma JSE: Środowiska programistyczne dla języka Java. Wstęp do programowania w języku obiektowym. Opracował: Andrzej Nowak

8. Wektory. Przykłady Napisz program, który pobierze od użytkownika 10 liczb, a następnie wypisze je w kolejności odwrotnej niż podana.

Spis treści. Funkcje. 1 Funkcje 1.1 Zadanie Zadanie Zadanie Zadanie Zadanie Zadanie Zadanie 7

Szablony klas, zastosowanie szablonów w programach

Rekurencja, schemat rekursji i funkcje pierwotnie rekurencyjne

operator zmiany znaku operatory mnożenia, dzielenia, dzielenia modulo operatory dodawania, odejmowania

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

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

Transkrypt:

PARADYGMATY I JĘZYKI PROGRAMOWANIA Haskell. (w11)

!!! 2

Brian Beckman o Monadach 3 Brian Beckman: Don't fear the Monad - YouTube

Plan wykładu 4 Typy Funkcje Preludium take, cycle zip, unzip, zipwith filter, map Klasy typów danych Show Eq, Ord Num, Integral, Fractional, Floating Funktor Monady Id Maybe [] IO Notacja do Wykład Briana Beckmana o monadach dont- fear- the- monad- a- monoid- is Przykłady

Typy 5 Typ funkcji f x y = x*x + y*y main = print (f 2.3 4.2) :type f f :: Num => a -> a ->a Int =typ Int Int -> Int =typ funkcji z Int do Int Float -> Int =typ funkcji z Float do Int a -> Int =t. funkcji z dowolnego t. do Int a -> a =t. f. z a do a a -> a-> a =t. f. dwuargumentowej z (a,a) do a W wyrazenie a->a->a symbol a oznacza zmienną typową. Funkcja bierze dwa argumenty typu a i jej wynikiem jest wartość typu a. Zmienna typowa a może przyjmować rożne wartości typowe (Int, Integer, Float). (tzw. polimorfizm parametryczny) W przykładzie a należy do klasy typów Num (Num => a a -> a->).

Typy 6 :type f f :: Num => a -> a ->a To można interpretować również inaczej. Jest to funkcja jednego argumentu typu a, której wynikiem jest funkcja (a - > a), pobierająca argument typu a i wydająca wynik typu a. Wyrażenie f 3 4 jest równoważne (f 3) 4 co oznacza, że (f 3) jest funkcją jednoargumentową... f :: Num => a -> a ->a g :: Num => a -> a g = f 3 g y - - funkcja 3*3 +y*y

Przykład (O. Taykalo) 7 Suma liczb parzystych [1,2,3,4,5] - > 2 + 4 - > 6 C: function evensum(list) { } var result = 0; for (var i=0; i< list.length ; i++) { if (list[i] % 2 ==0) { } } return result; result += list[i]; Zamiast pętli -> REKURENCJA

Przykład 8 int evensum(int *list) { return accumsum(0,list); } int accumsum(int n, int *list) { int x; int *xs; if (*list == 0) { // if the list is empty return n; } else { x = list[0]; // let x be the first element of the list xs = list+1; // let xs be the list without x if ( 0 == (x%2) ) { // if x is even return accumsum(n+x, xs); } else { return accumsum(n, xs); } } }

Przykład v1 9 -- Version 1! evensum :: [Integer] -> Integer evensum l = accumsum 0 l accumsum n l = if l == [] then n else let x = head l xs = tail l in if even x then accumsum (n+x) xs else accumsum n xs

Przykład v2 (bez zaśmiecania...) 10 -- Version 2! evensum :: Integral a => [a] -> a evensum l = accumsum 0 l where accumsum n l = if l == [] then n else let x = head l xs = tail l in if even x then accumsum (n+x) xs else accumsum n xs

Przykład v3 (wzorce) 11 -- Version 3! evensum l = accumsum 0 l where accumsum n [] = n accumsum n (x:xs) = if even x then accumsum (n+x) xs else accumsum n xs

Przykład v4 (redukcja η) 12 -- Version 4! evensum :: Integral a => [a] -> a evensum = accumsum 0 where accumsum n [] = n accumsum n (x:xs) = if even x then accumsum (n+x) xs else accumsum n xs

Przykład v5 (funkcje wyższego rzędu) 13 filter :: (a -> Bool) -> [a] -> [a] map :: (a -> b) -> [a] -> [b] foldl :: (a -> b -> a) -> a -> [b] -> a -- Version 5! evensum l = mysum 0 (filter even l) where mysum n [] = n mysum n (x:xs) = mysum (n+x) xs

Przykład v6 (- >strict, leniwość) 14 foldl -> foldl -- Version 6! -- foldl' importujemy z modułu Data.List import Data.List evensum l = foldl' mysum 0 (filter even l) where mysum acc value = acc + value

Przykład v7 (lambda) 15 -- Version 7! -- Lepiej jest importować tylko to co potrzebne import Data.List (foldl') evensum l = foldl' (\x y -> x+y) 0 (filter even l)

Przykład v8 ( \x y -> x+y --> (+)) 16 -- Version 8! import Data.List (foldl') evensum :: Integral a => [a] -> a evensum l = foldl' (+) 0 (filter even l) Integer może być dowolnie dużą liczbą całkowitą: Prelude> 19^17 5480386857784802185939

Przykład v9 (operator.) 17 -- Version 9! import Data.List (foldl') evensum :: Integral a => [a] -> a evensum = (foldl' (+) 0). (filter even)

Przykład v10 (klarowność) 18 Przezwiemy pewne części... -- Version 10! import Data.List (foldl') sum' :: (Num a) => [a] -> a sum' = foldl' (+) 0 evensum :: Integral a => [a] -> a evensum = sum'. (filter even)

Przykład zastosowanie... 19 Suma kwadratów liczb parzystych squareevensum = sum'. (filter even). (map (^2)) squareevensum' = evensum. (map (^2)) squareevensum'' = sum'. (map (^2)). (filter even) Dodaliśmy funkcję map, która stosuje inną funkcje (tutaj (^2)) do listy.

20 Funkcje podstawowe take, cycle, zip, unzip, zipwith, filter, map,...

take 21 lista = [1..] głowa i ogon listy; dopasowanie do wzorca; pa#ern- matching; og (x:y) = y og [] = [] -- ogon listy gl (x:y) = x -- głowa listy gl [] = error gl [] głowa (head) i ogon (tail) są zdefiniowane w Prelude Haskella

take 22 DEFINICJA take :: Int -> [a] -> [a] take 0 _ = [] take n (x:xs) = x : take (n-1) xs take _ [] = [] Pierwsza linia jest definicją typu funkcji: Int -> [a] -> [a] argumenty funkcji są typu Int i [a], a wynik jest typu [a]. Tutaj [a] jest typem listowym o elementach typu a take pobiera liczbę i listę i zwraca listę elementów tego samego typu. Funkcja take jest standardowo zdefiniowana w Preludium. Podkreślenie (_) oznacza dowolny argument, który nie jest używany z prawej strony definicji.

cycle 23 DEFINICJA: cycle [] =[] -- cycle :: [a] -> [a] cycle x = x + cycle x Definicja w Preludium: cycle :: [a] -> [a] cycle x = x where x = x ++ x Jeśli wywołamy cycle x to obliczenia będą trwały w nieskończoność. Powinniśmy użyć, np. take 5 (cycle abc ) abcab. Inny przykład: let lista = cycle [1,0] take 4 lista [1,0,1,0]

zip, unzip, zipwith 24 Sygnatury zip :: [a] -> [b] ->[(a, b)] unzip :: [(a, b)] -> ([a], [b]) zipwith :: (a -> b -> c) -> [a] -> [b] -> [c] zip i unzip konstruują listy z kolejnych elementów list wejściowych. Przykłady: zip [1..] (cycle [3,2]) [(1,3), (2,2), (3,3), (4,2),...] take 4 (zip [1..] (cycle [3,2])) [(1,3),(2,2),(3,3),(4,2)] zipwith tworzy listę stosując do pary określoną funkcje zipwith (+) x y - - sumowanie list x i y zipwith (*) [1,2,3] [2,3,4] - - mnożenie list

Liczby Fibonacciego 25 fib :: Int -> Int fib 0 = 1 fib 1 = 1 fib n = fib n-1 + fib n-2 Lepszą definicję dostaniemy zauważając, że suma liczb ciągu Fibonacciegi i jego ogona daje ogon ogona: 1, 1, 2, 3, 5, 8, 13, 21,... + 1, 2, 3, 5, 8, 13, 21, 34,... = 2, 3, 5, 8, 13, 21, 34, 55,... brakuje 2 pierwszych Możemy więc napisać fibs = 1 : 1 : zipwith (+) fibs (tail fibs) (liniowy czas wykonania; pamiętane wyliczone elementy):

filter 26 filter wybiera z listy tylko określone elementy (Zawłocki, Haskell) let odds = filter odd [1..] take 3 odds [1,3,5] Przykład. Sito Eratostenesa sito :: Int -> [Int] -> [Int] sito n m = filter (niedzieliprzez n) m where niedzieliprzez n k = (k `mod` n) /= 0 -- infix mod eratostenes :: [Int] -> [Int] eratostenes (n:m) = n : eratostenes (sito n m) eratostenes [] = [] pierwsze = eratostenes [2..] take 20 pierwsze [2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71]

map 27 :t map map :: (a -> b) -> [a] -> [b] Argumentami map jest funkcja typu a->b i lista elementów typu a (czyli [a]). Wynikiem jest lista elementów typu b (czyli [b]) otrzymana przez aplikację funkcji do kolejnych elementów listy wejściowej.

foldl 28 foldl redukuje listę przy pomocy zadanej operacji foldl :: (a -> b -> a) -> a -> [b] -> a foldl op z [] ---> z foldl op z [a1, a2,..., an] --->> (...((z `op` a1) `op` a2) op`...`op` an) and, or :: [Bool] -> [Bool] and = foldl (&&) True or = foldl ( ) False len :: [a] -> Int len = foldl (+) 0.map one where one n = 1 sum, prod :: [a] -> Int sum = foldl (+) 0 prod = foldl (*) 1

29 Klasy typów danych Show, Eq, Ord, Num, Integral, Fractional, Floating, Funktor

Klasy typów danych 30 Prelude> map <interactive>:5:1: No instance for (Show ((a0 -> b0) -> [a0] -> [b0])) arising from a use of `print' Possible fix: add an instance declaration for (Show ((a0 -> b0) -> [a0] -> [b0])) In a stmt of an interactive GHCi command: print it Prelude> Widzimy, że brakuje tutaj metody, która wyprowadza (wypisuje) map. Jest to metoda show używana przez `print. Metody show są metodami typów z klasy Show. Klasa Show ma postać (Typ a należy do klasy Show): class Show a where show :: a -> String -- duża litera S w Show -- mała litera s w show

Klasy typów danych 31 Zdefiniujmy nowy typ drzew binarnych Drzewo: data Drzewo a = Lisc Konar (Drzewo a) a (Drzewo a) wstaw Lisc x = Konar Lisc x Lisc wstaw (t@(konar d1 y d2)) x x == y = t x < y = Konar (wstaw d1 x) y d2 otherwise = Konar d1 y (wstaw d2 x) Sprawdżmy typ funkcji insert :t wstaw wstaw :: Ord a => Drzewo a -> a -> Drzewo a Ord a => jest to kontekst, który mówi, że typ a musi należeć do klasy typów Ord; funkcja (<) jest zdefiniowana tylko dla tej klasy typów; funkcja (==) należy do typów klasy Eq. Założenie, że a należy do Eq jest niepotrzebne, bo typy Ord należą do klasy Eq automatycznie.

Klasy typów danych 32 Funkcja insert posłuży do redukcji listy, polegającej na wstawieniu elementów listy do drzewa: wstawliste :: (Ord a) => Drzewo a -> [a] -> Drzewo a wstawtliste = foldl wstaw zlisty = wstawliste Lisc Sprawdzenie...

Klasy typów danych 33 Funkcja wypisująca drzewo: pokazujdrzewo :: (Show a) => Drzewo a -> String pokazujdrzewo t = pokazujdrzewo' t where pokazujdrzewo' Lisc = id pokazujdrzewo' (Konar t1 a t2) = ('(':). pokazujdrzewo' t1. ((show a) ++). pokazujdrzewo' t2. (')':) Zgłoszenie klasy typu Drzewo i funkcja show: instance (Show a) => Show (Drzewo a) where show = pokazujdrzewo

Klasy typów danych 34 W typie funkcji pokazujdrzewo pojawia się nazwa klasy Show. Elementami Show są typy dla których zdefiniowana jest funkcja show do wypisywania danych typu a. Klasa Show ma postać (Typ a należy do klasy Show): class Show a where -- duże S show :: a -> String -- małe s (Typ a należy do klasy Show jeśli jest dla niego zdefiniowana funkcja show) Przynależność do klasy Show zgłaszamy jawnie: instance (Show a) => Show (Drzewo a) where show = pokazujdrzewo Podobnie jest z innymi klasami typów

Klasa Eq 35 class Eq a where (==) :: a -> a -> Bool (/=) :: a -> a -> Bool (/=) = not. (==) class (Eq a) => Ord a where compare :: a -> a -> Ordering (<) :: a -> a -> Bool (<=) :: a -> a -> Bool (>) :: a -> a -> Bool (>=) :: a -> a -> Bool max :: a -> a -> a min :: a -> a -> a

Inne klasy 36 Num z operacjami takimi jak (+), (-), (*) czy frominteger (do tej klasy należą między innymi typy Int, Integer, Float, Double), Integral operacje quot, rem, div, tointeger, Fractional operacje (/) i fromrational, Floating pi, exp, log, sin itp.

Functor 37 Klasa Functor posiada tylko jedna operację class Functor f where fmap :: (a -> b) -> f a -> f b Do tej klasy należy [a]. Nowe klasy typów definiuje się, podając operacje, które mają być na nich zdefiniowane; przykład klasa Dict (patrz np. Zawłocki)

38 Monady Klasa Monad

Brian Beckman o Monadach 39 Brian Beckman: Don't fear the Monad - YouTube

Monady 40 Pojęcie z filozofii (Pitagorejczycy, Leibniz) i matematycznej teorii kategorii i funktorów Eugenio Mogi (lata 80te XX wieku) wprowadzenie monad do informatyki Philip Wadler zastosowanie monad w informatyce Nie ma nic oprócz monad, albo inaczej - wszystko co istnieje musi być monadą, czyli osobnym bytem, który zawiera w sobie całą prawdę o sobie. (GoCried Wilhelm Leibniz, 1646-1716) Philip Wadler

Monady 41 Efekty uboczne, we/wy,... Funkcje czyste i nieczyste Lenistwo Przeźroczystość referencyjna W PROGRAMOWANIU FUNKCYJNYM WSZYSTKO MUSI BYĆ FUNKCJĄ! MONADA PRZEDSTAWIA SEKWENCYJNE WYKONANIE OKREŚLONYCH AKCJI. Wymagane jest zdefiniowanie trzech operacji: return, (>>=) i (>>): return x -- akcja zwrotu x f >>= g -- zwija dwie akcje (g działa na wynik f) f >> g -- zwija akcje g i f ale g nie uwzględnia wyniku f Należy pamiętać, że efekty uboczne są przekazywane w ukryty sposób w obu operacjach składania (>>=) i (>>)

Monady 42 Typy akcji monadowych return :: (Monad m) => a -> m a (>>=) :: (Monad m) => m a -> (a -> m b) -> m b (>>) :: (Monad m) => m a -> m b -> m b Interpretacja konstruktora m: Jeśli a jest typem wartości to m reprezentuje typ obliczeń zwracających wartość typu a Obliczenie typu m a może być np.: wartością typu a; m jest wtedy trywialnym obliczeniem wartością typu a lub wyjątkiem reprezentującym błąd zbiorem wartości typu a; m a oznacza wtedy obliczenie niedeterministyczne programem z efektami ubocznymi reprezentowanymi przez funkcję typu s -> (a, s), gdzie s jest typem stanu modyfikowanym przez funkcję

Klasa Monad 43 Operacje return i (>>=) spełniają pewne związki wynikające z kategoryjnej semantyki monad: 1. return a >>= \x -> b === (\x -> b) a 2. f >>= \x -> return x === f 3. f >>= (\x -> g >>= \y -> h) === (f >>= \x -> g) >>= \y -> h Pierwsze dwa związki pokazują jak zachowuje się return po obu stronach operacji >>= Związek trzeci stwierdza łączność >>=. O zapewnienie tych związków dba programista.

Przykłady monad 44 Monada Id Reprezentuje obliczenia, które nie robią nic data Id a = Id a instance Monad Id where return = Id (Id a) >>= f = f a Monada Maybe Wartości typu Maybe a (konstruktorem typu jest Maybe) reprezentują wynik typu a lub błędne obliczenia reprezentowane przez konstruktor Nothing

Przykłady monad 45 Maybe cd. data Maybe a = Just a Nothing instance Monad Maybe where return = Just Nothing >>= m = Nothing (Just a) >>= m = m a

Przykład zastosowania Maybe 46 Funkcja, która dla danego słownika będącego listą par (String, Int) i dla danych dwu kluczy wyszukuje związane z nimi wartości i zwraca ich sumę. W przypadku gdy wartości nie są zdefiniowane zwraca Nothing. lookup :: (Eq a) => a [(a,b)] -> Maybe b lookupsum :: [(String, Int)] -> String -> String -> Maybe Int LookupSum l k1 k2 = lookup k1 l >>= \v1 -> lookup k2 l >>= \v2 -> return (v1 + v2) Funkcja lookup jest funkcją standardową.

Monady... 47 Monada Result Więcej informacji o błędach data Result a = OK a Failure String instance Monad Result where return = OK fail = Failure (OK a) >>= f = f a (Failure s) >>= _ = fail s fail jest funkcją standardową typu String -> m a z klasy Monad. fail str reprezentuje nieudane obliczenie z informacją o błędzie w napisie str.

Monady... 48 Monada [] Listy są klasy Monad. Wartość typu [a] jest obliczeniem, zwracającym całą listę wyników instance Monad [] where return a = [a] l >>= f = concat (map f l) fail _ = [] Zadanie. Zapisać równości monad dla list. np. concat (map (\x -> a) [b]) === (\x -> a) [b]

Monady... 49 Monada IO Operacje we/wy są operacjami o efekach ubocznych (zmiany stanu). Jeśli np. typ Świat reprezentuje stan Świata, to obliczenia, które zwracają wartości typu a i zmieniają stan Świata (efekt uboczny obliczeń) można traktować jako element typu Świat -> (a Świat). W języku Haskell zamiast Świat używamy typu IO a. Ponieważ wiemy, że konstruktor IO jest monadą, więc możemy składać operacje z efektami ubocznymi.

IO... 50 Przykłady funkcji standardowych: getchar :: IO Char putchar :: IChar -> IO () getline :: IO String putstr :: String -> IO () print :: Show a => a -> IO () Przykłady złożeń funkcji standardowych echo :: IO () echo = getline >>= putstr

IO... 51 Przykłady złożeń funkcji standardowych palindrom :: IO () palindrom = putstr Podaj napis >> getline >>= \line let line =[tolower c c <- line, c /= in if line == reverse line then putstr( jest palindromem\n ) else putstr( nie jest palindromem )

Monady... 52 Notacja do Przykład: palindrom palindrom :: IO () palindrom = do putstr Podaj napis cs <- getline if palindrom cs then putstr Tak.\n else putstr Nie.\n czy_palindrom :: String -> Bool czy_palindrom x = (x == reverse x)

Funkcje wyższego rzędu 53 Funkcje jednoargumentowe Funkcje wieloargumentowe redukowane są do funkcji jednoargumentowych np. f x y === (f x) y curry uncurry Funkcje wyższego rzędu są to funkcje, które generują lub pobierają inne funkcje (argumenty wejściowe i ich wyniki są funkcjami) Haskell Curry (1900-1982)

Zadania 54 Poniższe zadania zrealizować w języku Haskell. 1. Napisać program obliczania pochodnej funkcji jednej zmiennej. 2. Napisać program poprawiania obliczeń pochodnej metodą Richardsona. 3. Podać definicję funkcji zip i unzip (zip bierze dwie listy i tworzy listę par złożonych z kolejnych elementów obu list; unzip bierze listę par i tworzy parę list tak, jak w przykłądzie). Przykład: zip [1,2,3,4] [5,6,7,8] [(1,5),(2,6),(3,7),(4,8)] unzip [(1,5),(2,6),(3,7),(4,8)] ([1,2,3,4],[5,6,7,8]) 4. Sito Eratostenesa wybierania liczb pierwszych (użyć funkcji take).

Pierwiastek stary przykład 55 -- pierwiastek kwadratowy; metoda Newtona-Raphsona -- formula = x <- 0.5*(x+kwadrat/x) -- Przykładowe wywołanie: pierwiastek 2 -- leniwy ciag Newtona-Raphsona -- leniwycnr a = rekurencja a (formula a) where formula kwadrat x = 0.5*(x + kwadrat/x) rekurencja start f = start:rekurencja (f start) f -- przyblizenie -- przyblizenie epsilon (x1:x2:ogon) abs(x1-x2) < epsilon = x2 otherwise = przyblizenie epsilon (x2:ogon) -- wszystko razem -- pierwiastek a = przyblizenie (a*0.0000000001) (leniwycnr a)

Inne równania f x = 0! 56 -- metoda Newtona-Raphsona -- (Bird, Wadler) -- pierwiastek kwadratowy -- z liczby >=0 sq1 x = until satis improve x where satis y = abs(y^2-x)<eps improve y = (y + x/y)/2 eps = 0.000000001*x -- pochodna deriv f x =(f (x+dx)-f x)/dx where dx = 0.0001 -- ogolniej metoda newtona newton f = until satis improve where satis y =abs (f y)<eps improve y = y-(f y/deriv f y) eps = 0.0001 -- pierwiastek kwadratowy sq2 x = newton f x where f y = y^2 - x -- pierwiastek szescienny cubrt x = newton f x where f y = y^3 - x

Kula... n- wymiarowa 57 Objętość kuli: Powierzchnia sfery: Zadanie. Napisz leniwy program obliczania objętości kuli i powierzchni sfery w n wymiarach.

O lenistwie 58 Pochwała lenistwa Heskell to leń dobrze zorganizowany (Zawłocki)

Literatura 59 Oleg Taykalo (sieć) Zawłocki (sieć) wazniak (sieć) Bylina + Bylina

Za tydzień: Prolog 60