exer - Szymon Chlebowski
Transkrypt
exer - Szymon Chlebowski
Haskell - wprowadzenie Szymon Chlebowski 22 grudnia 2015 1 Czym jest Haskell? 1. Programowanie funkcyjne 2. Rachunek lambda z typami i bez typów λx.N : A → B 3. Rekurencja - definicje rekurencyjne sum :: Num a => [a] -> a sum [] = 0 sum (x:xs) = x + sum xs product :: Num a => [a] -> a product [] = 1 product (x:xs) = x * product xs iselem :: Eq a => a -> [a] -> Bool iselem x [] = False iselem x (y:ys) | x == y = True | otherwise = iselem x (ys) 4. Pattern-matching - przykład & & & & & :: Bool -> Bool -> Bool True True = True True False = False False True = False False False = False & :: Bool -> Bool -> Bool & True True = True & _ _ = False 5. List comprehension - ’teoriomnogościowe’ definiowanie zbiorów - przykład [x^2 | x <- [1..1000]] , [(a,b) | a <- [1..10], b <- [2,4..10], a/= b] 1 2 Typy danych Typy - kolekcje obiektów na których można wykonywać pewne operacje, Klasy - kolekcje typów. Np. Ord jest klasą składającą się z typów, których elementy można porównywać za pomocą pewnych relacji porządkujących. 1. Char - single characters - ‘a‘, ‘b‘ ... 2. Bool - wartości logiczne - True, False 3. String - listy elementów typu Char - ”logika” = [‘l‘, ‘o‘, ‘g‘, ‘i‘, ‘k‘, ‘a‘] 4. Int, Integer, Float 5. List - ciąg elementów tego samego typu np. [True, False, False] 6. Tuples - n-tki uporządkowane - (T1 , T2 , ..., Tn ), gdzie elementy mogą mieć różne typy - (False, 0) 7. Functions - funkcje - Ti −→ Tj - o argumencie typu Ti i wartości typu Tj . Oczywiście Tj może być również typem funkcji - funkcje wyższego rzędu 3 Currying 1. Funkcja o dowolnej ilości argumentów może być przedstawiona jako jednoargumentowa funkcja wyższego rzędu. 2. Intuicyjnie, dodawanie ma typ: (+) :: Num a => (a, a) -> a jednak może być przedstawione także jako: (+) :: Num a => a -> a -> a Zauważ, że tak rozumiane dodawanie jest jednoargumentową funkcją, która zwraca inną jednoargumentową funkcję. Dodanie 2+1 przebiega następująco: (a) (+) 2, (b) (2 +) 1, (c) 2+1. (a) jest jednoargumentową funkcją oraz (b) jest jednoargumentową funkcją. 4 Przykład qsort :: Ord a => [a] -> [a] qsort [] = [] qsort (x:xs) = qsort smaller ++ [x] ++ qsort larger where smaller = [a | a <- xs, a <= x] larger = [b | b <- xs, b > x] 5 Listy 1. []- lista pusta 2. (x:xs)- niepusta lista, której pierwszym elementem jest x, a reszta jest w xs 3. ++ - operacja konkatenacji dwóch list 6 Operacje na listach head’ :: [a] -> a head’ (x:xs) = x tail’ :: [a] -> [a] tail’ (x:xs) = xs 2 7 Ćwiczenia 0. Zdefiniuj funkcję dis alternatywy. 1. Zdefiniuj funkcję length’ , która mierzy liczebność listy elementów dowolnego typu 2. Zdefiniuj funkcję reverse’, która odwraca kolejność elementów dowolnej listy. 3. Zdefiniuj funkcję selectn, która wybiera n-ty element niepustej listy (licząc od zera) 4. Zdefiniuj funkcję last’, która zwraca ostatni element listy. 5. Zdefiniuj funkcję init’, która usuwa ostatni element z listy. 6. Załóży, że dysponujesz funkcją następnika, zdefiniowaną np. w ten sposób: succ :: Int -> Int -> Int succ n = n+1 Zdefiniuj funkcję add dodawania, odwołując się wyłącznie do funkcji następnika (succ) oraz odejmowania −. 7. Używając zdefiniowanej wcześniej funkcji add zdefiniuj funkcję times mnożenia dwóch liczb 8. Zdefiniuj funkcję heh, której argumentem jest liczba naturalna , zaś wartością jest zbiór składający się z wszystkich par liczb takich, że druga z nich jest o 1 większa od pierwszej, zaś obie są nie większe niż argument funkcji. Np. heh 3 = [(1,2), (2,3)] heh 1 = [] 3