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

Podobne dokumenty