1. Wstep
˛
Jezyk
˛
Przykłady
Haskell
´
Tomek „QsoRiX” Rydzynski
rydzyn@student.agh.edu.pl
Koło Naukowe Informatyków BIT
27 listopada 2008 / Biwak
QsoRiX Haskell
2. Wstep
˛
Jezyk
˛
Przykłady
Dobry wieczór!
Nie znam Haskella...
Dlatego chetnie co´ o nim opowiem
˛ s
´
Je´ li macie pytania, smiało
s
QsoRiX Haskell
3. Wstep
˛
Jezyk
˛
Przykłady
Plan na dzi´
s
1 Wstep
˛
Haskell
Kto tego u˙ ywa?
z
Jak to wyglada?
˛
2 Jezyk
˛
Podstawowe struktury danych
Cukier
System typów
Cz˛ sciowa aplikacja
e´
3 Kilka przykładów i programowanie funkcyjne
Rot13
Kalkulator RPN
Hello World w Gtk+
Watki
˛
QsoRiX Haskell
4. Wstep
˛ Haskell
Jezyk
˛ Kto tego u˙ ywa?
z
Przykłady Jak to wyglada?
˛
Programowanie funkcyjne
Maszyna Turinga vs Rachunek Lambda
Program jest funkcja, wykonanie polega na wyznaczeniu
˛
jej warto´ ci
s
Funkcje sa obiektami pierwszej kategorii – to tylko
˛
warto´ ci, które chca argumenty
s ˛
Przykłady: SQL, Arkusze kalkulacyjne, Scheme, Erlang,
Haskell
QsoRiX Haskell
5. Wstep
˛ Haskell
Jezyk
˛ Kto tego u˙ ywa?
z
Przykłady Jak to wyglada?
˛
Zalety programowania funkcyjnego
Mówimy „co” zamiast „jak” chcemy obliczy´
c
Zmniejsza sie odstep miedzy idea algorytmu a jego
˛ ˛ ˛ ˛
zapisem
Kod jest zwykle krótszy
s´
wy˙ sza produktywno´ c
z
łatwiejsze zarzadzanie
˛
s´ ˛
mniejsza ilo´ c błedów
QsoRiX Haskell
6. Wstep
˛ Haskell
Jezyk
˛ Kto tego u˙ ywa?
z
Przykłady Jak to wyglada?
˛
Historia
’88 – ustalono nazwe
˛
’98 – zamro˙ ony release
z
’99 – rozwiazano komitet
˛
’02 – wydano poprawiony standard
´
zima ’08 – Rydzynski, T. zaczyna uczy´ sie Haskella
c ˛
´ ´
jesien ’08 – Rydzynski, T. zaczyna uczy´ Haskella
c
QsoRiX Haskell
7. Wstep
˛ Haskell
Jezyk
˛ Kto tego u˙ ywa?
z
Przykłady Jak to wyglada?
˛
Co to jest?
Jezyk...
˛
czysto funkcyjny:
leniwe warto´ ciowanie
s
brak efektów ubocznych
brak zmiennych
statycznie i silnie typowany
QsoRiX Haskell
8. Wstep
˛ Haskell
Jezyk
˛ Kto tego u˙ ywa?
z
Przykłady Jak to wyglada?
˛
Małe porównanie
Evaluation IO Typing Pure
Haskell lazy monads static yes
Clean lazy uniqueness static yes
Miranda lazy lazy lists static yes
ML strict side-effects static no
Scheme strict side-effects dynamic no
Erlang strict side-effects dynamic1 no
http://haskell.org/haskellwiki/Comparison_of_functional_programming_languages
1
with compiler annotations for static typing
QsoRiX Haskell
9. Wstep
˛ Haskell
Jezyk
˛ Kto tego u˙ ywa?
z
Przykłady Jak to wyglada?
˛
Kto tego u˙ ywa?
z
Lista ze strony www.haskell.org:
Glasgow Haskell Compiler (GHC) – 100k lini kodu
Darcs – system kontroli wersji
Pugs – implementacja Perla 6
Credit Suisse
Antiope
Amgen
ABN AMRO
Peerium, Inc
Galois, Inc
Microsoft Research
Bluespec, Inc
Eaton Corporation
Qualcomm, Inc
Deutsche Bank
QsoRiX Haskell
10. Wstep
˛ Haskell
Jezyk
˛ Kto tego u˙ ywa?
z
Przykłady Jak to wyglada?
˛
Silnia
1 dla n = 0
n! =
n(n − 1)! dla n ≥ 1
fact n | n == 0 = 1
| n >= 1 = n * fact (n-1)
n
n! = k
k =1
fact n = product [1..n]
QsoRiX Haskell
11. Wstep
˛ Haskell
Jezyk
˛ Kto tego u˙ ywa?
z
Przykłady Jak to wyglada?
˛
QuickSort
qsort [] = []
qsort (x:xs) = qsort (filter (< x) xs) ++
[x] ++
qsort (filter (>= x) xs)
QsoRiX Haskell
12. Wstep
˛ Haskell
Jezyk
˛ Kto tego u˙ ywa?
z
Przykłady Jak to wyglada?
˛
Pochwała lenistwa
s´
> Cze´c!
>
> Przepraszam, ˙e odpisuj˛ dopiero teraz,
z e
> ale ostatnio uczyłem si˛ Haskella...
e
pre s = quot;> quot; ++ s
main = putStr.unlines.(map pre).lines=<<getContents
main = interact $ unlines . (map (quot;> quot;++)) . lines
QsoRiX Haskell
13. Podstawowe struktury danych
Wstep
˛
Cukier
Jezyk
˛
System typów
Przykłady
Cz˛ sciowa aplikacja
e´
Lista
Dowolnej długo´ ci
s
Mo˙ e zawiera´ elementy tylko jednego typu
z c
Typowa budowa: głowa i ogon
Składnia
[ 1 , 2 , 3 , 4 ]
1 : [ 2 , 3 , 4 ]
1 : 2 : 3 : 4 : []
QsoRiX Haskell
14. Podstawowe struktury danych
Wstep
˛
Cukier
Jezyk
˛
System typów
Przykłady
Cz˛ sciowa aplikacja
e´
Krotka
Odpowiednik krotek z algebry
s´
Długo´ c jest okre´ lona
s
Typ elementów mo˙ e by´ ró˙ ny
z c z
Składnia
( 12 , GR , quot;tylko nie płacz prosz˛quot; )
e
QsoRiX Haskell
15. Podstawowe struktury danych
Wstep
˛
Cukier
Jezyk
˛
System typów
Przykłady
Cz˛ sciowa aplikacja
e´
... poza tym
W standardowej bibliotece sa miedzy innymi:
˛
Array
ByteString
Graph
HashTable
List
Map
Sequence
Set
Time
Tree
QsoRiX Haskell
16. Podstawowe struktury danych
Wstep
˛
Cukier
Jezyk
˛
System typów
Przykłady
Cz˛ sciowa aplikacja
e´
Dopasowanie warto´ ci atrybutów
s
ack 0 y = y + 1
ack x 0 = ack (x-1) 1
ack x y = ack (x-1) (ack x (y-1))
fst (x, _) = x
snd (_, y) = y
QsoRiX Haskell
17. Podstawowe struktury danych
Wstep
˛
Cukier
Jezyk
˛
System typów
Przykłady
Cz˛ sciowa aplikacja
e´
Guards
sign x | x > 0 = 1
| x == 0 = 0
| x < 0 = -1
QsoRiX Haskell
18. Podstawowe struktury danych
Wstep
˛
Cukier
Jezyk
˛
System typów
Przykłady
Cz˛ sciowa aplikacja
e´
List comprehensions
[ (x, y) | x <- [-5..5]
, y <- [-x..x]
, x+y == 3
]
[(2,1), (3,0), (4,-1), (5,-2)]
QsoRiX Haskell
19. Podstawowe struktury danych
Wstep
˛
Cukier
Jezyk
˛
System typów
Przykłady
Cz˛ sciowa aplikacja
e´
Własne operatory
a ## b = a + b + a^b
(##) a b = a + b + a^b
2 ## 3 == 13
a ‘sq‘ b = a^2 + b^2
sq a b = a^2 + b^2
2 ‘sq‘ 5 == 29
QsoRiX Haskell
20. Podstawowe struktury danych
Wstep
˛
Cukier
Jezyk
˛
System typów
Przykłady
Cz˛ sciowa aplikacja
e´
Silne typowanie i inferencja
Wszystkie obiekty (czyli tak˙ e funkcje) posiadaja swój typ,
z ˛
c s´
chocia˙ mo˙ e on by´ do´ c ogólny – polimorficzny
z z
Nie trzeba podawa´ typów, sa one dedukowane na
c ˛
podstawie ró˙ nych wskazówek i operatorów z jakich
z
budujemy wyra˙ enie
z
Jawne okre´ lanie typu bywa bardzo pomocnym elementem
s
dokumentujacym i cz˛
˛ esto ułatwia prace
˛
QsoRiX Haskell
21. Podstawowe struktury danych
Wstep
˛
Cukier
Jezyk
˛
System typów
Przykłady
Cz˛ sciowa aplikacja
e´
Typowanie - przykład
Składnia
-- Nadanie stałej 10 typu Integer
10 :: Integer
-- Typ funkcji
add :: Integer -> Integer -> Integer
-- Typ polimorficzny oraz lista
repeat :: a -> [a]
QsoRiX Haskell
22. Podstawowe struktury danych
Wstep
˛
Cukier
Jezyk
˛
System typów
Przykłady
Cz˛ sciowa aplikacja
e´
Inferencja - przykład
Kompilator domy´ lnie u˙ ywa jak najbardziej ogólnych
s z
typów
z ´
Ograniczenia sa „dziedziczone” tak, aby typ wyra˙ en
˛
zło˙ onych był w zgodzie z typami składowych czastkowych
z ˛
Mechanizm inferencji
repeat :: a -> [a]
3 :: Integer
repeat 3 :: [Integer]
QsoRiX Haskell
23. Podstawowe struktury danych
Wstep
˛
Cukier
Jezyk
˛
System typów
Przykłady
Cz˛ sciowa aplikacja
e´
Inferencja - przykład c.d.
Je˙ eli kompilator nie mo˙ e dopasowa´ typów tak, aby
z z c
zachowa´ wszystkie wymagania, sygnalizowany jest bład
c ˛
Mechanizm inferencji
add :: Integer -> Integer -> Integer
add x y = x + y
ghci> :t quot;fooquot;
quot;fooquot; :: [Char]
ghci> add quot;fooquot; quot;barquot;
Couldn’t match expected type ‘Integer’
against inferred type ‘[Char]’
QsoRiX Haskell
24. Podstawowe struktury danych
Wstep
˛
Cukier
Jezyk
˛
System typów
Przykłady
Cz˛ sciowa aplikacja
e´
Klasy
Skojarzenie z OOP jest mylace, chocia˙ z drugiej strony. . .
˛ z
Okre´ laja zestaw operacji mo˙ liwych do wykonania na
s ˛ z
typach wchodzacych w skład klasy
˛
Pozwalaja zdefiniowa´ zachowania funkcji w zale˙ no´ ci od
˛ c z s
typów argumentów
Polimorfizm statyczny
QsoRiX Haskell
25. Podstawowe struktury danych
Wstep
˛
Cukier
Jezyk
˛
System typów
Przykłady
Cz˛ sciowa aplikacja
e´
Klasy - jak to działa
Klasa Eq jest cz˛ scia biblioteki standardowej. Nale˙ a do niej
e´ ˛ z˛
typy, które mo˙ na porównywa´ .
z c
Klasa Eq
class Eq a where
(==) :: a -> a -> Bool
(/=) :: a -> a -> Bool
Je´ li typ jest elementem klasy Eq, mo˙ na u˙ ywa´ z nim
s z z c
˙
operatorów == i /=. I vice-versa – zeby typ był elementem klasy
Eq trzeba zdefiniowa´ , jak beda sie te operatory zachowywa´ .
c ˛ ˛ ˛ c
QsoRiX Haskell
26. Podstawowe struktury danych
Wstep
˛
Cukier
Jezyk
˛
System typów
Przykłady
Cz˛ sciowa aplikacja
e´
Własne typy danych
Typy algebraiczne wprowadzane słowem kluczowym data
sa odpowiednikiem struktur i unii znanych np. z C, poza
˛
tym umieja wiecej
˛ ˛
Słowem kluczowym type mo˙ na wprowadzi´ synonim typu,
z c
np. type String = [Char]
Dyrektywa newtype wprowadza nowy typ wykorzystujacy
˛
reprezentacje istniejacego
˛ ˛
Zda˙ e tylko wspomnie´ o oferowanych mo˙ liwo´ ciach :(
˛z ˛ c z s
QsoRiX Haskell
27. Podstawowe struktury danych
Wstep
˛
Cukier
Jezyk
˛
System typów
Przykłady
Cz˛ sciowa aplikacja
e´
Własne typy danych - przykład
Kolory
data Kolor = Czerwony
| Niebieski
| Pomara´czowy
n
Drzewo
data Tree a = Node (Tree a) a (Tree a)
| Leaf
-- przykład
type TreeOfInts = Tree Int
QsoRiX Haskell
28. Podstawowe struktury danych
Wstep
˛
Cukier
Jezyk
˛
System typów
Przykłady
Cz˛ sciowa aplikacja
e´
Dziedziczenie klas 1/3
Byłoby miło porównywa´ nasze kolory...
c
ghci> Czerwony == Czerwony
<interactive>:1:0:
No instance for (Eq Kolor)
arising from a use of ‘==’
Possible fix: add an instance declaration
for (Eq Kolor)
QsoRiX Haskell
29. Podstawowe struktury danych
Wstep
˛
Cukier
Jezyk
˛
System typów
Przykłady
Cz˛ sciowa aplikacja
e´
Dziedziczenie klas 2/3
Typ do wybranej klasy mo˙ na doda´ u˙ ywajac konstrukcji
z c z ˛
instance
instance Eq Kolor where
(==) Czerwony Czerwony = True
(==) Niebieski Niebieski = True
(==) Pomara´czowy Pomara´czowy
n n = True
(==) _ _ = False
˙
Uwierzcie na słowo, ze to działa
QsoRiX Haskell
30. Podstawowe struktury danych
Wstep
˛
Cukier
Jezyk
˛
System typów
Przykłady
Cz˛ sciowa aplikacja
e´
Dziedziczenie klas 3/3
Kolory dziedziczace Eq
˛
data Kolor = Czerwony
| Niebieski
| Pomara´czowy
n
deriving(Eq)
Kompilator potrafi wygenerowa´ za nas sensowne instancje dla
c
wszystkich klas ze standardowej biblioteki
ghci> Czerwony == Czerwony
True
ghci> Czerwony == Niebieski
False
QsoRiX Haskell
31. Podstawowe struktury danych
Wstep
˛
Cukier
Jezyk
˛
System typów
Przykłady
Cz˛ sciowa aplikacja
e´
Wszystko razem
Funkcja delete ma usuwa´ pierwsze wystapienie zadanej
c ˛
warto´ ci z listy
s
delete
delete x [] = []
delete x (y:ys) = if x == y
then ys
else y : (delete x ys)
Jakiego typu jest ta funkcja?
ghci> :t delete
delete :: (Eq a) => a -> [a] -> [a]
QsoRiX Haskell
32. Podstawowe struktury danych
Wstep
˛
Cukier
Jezyk
˛
System typów
Przykłady
Cz˛ sciowa aplikacja
e´
Podsumowanie
˙
Statyczne typowanie zapewnia, ze skompilowany program
nie posiada trywialnych błedów
˛
Brak domy´ lnych konwersji przekre´ la cała klase ró˙ nego
s s ˛ ˛ z
rodzaju problemów
˙
Inferencja – typowanie dostajemy bez zadnego balastu
Klasy pozwalaja na tworzenie konceptów i statyczny
˛
polimorfizm
<flame>Najlepszy system typów z jakim sie
˛
spotkałem</flame>
s´
„Wiekszo´ c kodu w Haskellu działa, o ile uda sie go
˛ ˛
skompilowa´ .”
c
QsoRiX Haskell
33. Podstawowe struktury danych
Wstep
˛
Cukier
Jezyk
˛
System typów
Przykłady
Cz˛ sciowa aplikacja
e´
Cz˛ sciowa aplikacja
e´
Majac funkcje, która dodaje jedna liczbe do drugiej, łatwo
˛ ˛ ˛ ˛
zrobi´ funkcje, która do liczby dodaje jeden
c ˛
Majac funkcje, która porównuje dwie liczby, łatwo zrobi´
˛ ˛ c
funkcje, która porównuje liczbe z zerem
˛ ˛
Majac funkcje, która wybiera z listy elementy spełniajace
˛ ˛ ˛
warunek, łatwo zrobi´ funkcje, która wybiera z listy liczby
c ˛
wieksze od zera
˛
QsoRiX Haskell
34. Podstawowe struktury danych
Wstep
˛
Cukier
Jezyk
˛
System typów
Przykłady
Cz˛ sciowa aplikacja
e´
Przykład
Łatwo zrobi´ funkcje, która porównuje liczbe z zerem...
c ˛ ˛
(<) :: (Ord a) => a -> a -> Bool
pos :: (Ord a, Num a) => a -> Bool
pos = ( 0 < )
Łatwo zrobi´ funkcje, która wybiera z listy liczby wieksze od
c ˛ ˛
zera...
filter :: (a -> Bool) -> [a] -> [a]
posInts :: (Ord a, Num a) => [a] -> [a]
posInts = filter pos
QsoRiX Haskell
35. Podstawowe struktury danych
Wstep
˛
Cukier
Jezyk
˛
System typów
Przykłady
Cz˛ sciowa aplikacja
e´
Wiecej o ->
˛
type UnaryOperator = Int -> Int
addSome :: Int -> UnaryOperator -- (1)
addSome x = (+) x
addSome :: Int -> UnaryOperator -- (2)
addSome x = y -> (+) x y
addSome :: Int -> Int -> Int -- (3)
addSome x y = (+) x y
addSome :: (Int -> UnaryOperator) -- (4)
addSome = (+)
QsoRiX Haskell
36. Wstep
˛
Jezyk
˛
Przykłady
Gdzie mo˙ na poczyta´
z c
Real World Haskell
www.haskell.org
http://haskell.org/haskellwiki/Introduction
http://haskell.org/haskellwiki/Why_Haskell_matters
. . . i reszta Wiki
Hoogle
google://Haskell
QsoRiX Haskell
37. Wstep
˛
Jezyk
˛
Przykłady
´
Co za tydzien?
Krzysiek Goj
Scala
3 grudnia 2008
QsoRiX Haskell
38. Wstep
˛
Jezyk
˛
Przykłady
Koniec
Dobranoc
QsoRiX Haskell