haskell
TRANSCRIPT
WstepJezyk
Przykłady
Haskell
Tomek „QsoRiX” [email protected]
Koło Naukowe Informatyków BIT
27 listopada 2008 / Biwak
QsoRiX Haskell
WstepJezyk
Przykłady
Dobry wieczór!
Nie znam Haskella...Dlatego chetnie cos o nim opowiemJesli macie pytania, smiało
QsoRiX Haskell
WstepJezyk
Przykłady
Plan na dzis1 Wstep
HaskellKto tego uzywa?Jak to wyglada?
2 JezykPodstawowe struktury danychCukierSystem typówCzesciowa aplikacja
3 Kilka przykładów i programowanie funkcyjneRot13Kalkulator RPNHello World w Gtk+Watki
QsoRiX Haskell
WstepJezyk
Przykłady
HaskellKto tego uzywa?Jak to wyglada?
Programowanie funkcyjne
Maszyna Turinga vs Rachunek LambdaProgram jest funkcja, wykonanie polega na wyznaczeniujej wartosciFunkcje sa obiektami pierwszej kategorii – to tylkowartosci, które chca argumentyPrzykłady: SQL, Arkusze kalkulacyjne, Scheme, Erlang,Haskell
QsoRiX Haskell
WstepJezyk
Przykłady
HaskellKto tego uzywa?Jak to wyglada?
Zalety programowania funkcyjnego
Mówimy „co” zamiast „jak” chcemy obliczycZmniejsza sie odstep miedzy idea algorytmu a jegozapisemKod jest zwykle krótszy
wyzsza produktywnoscłatwiejsze zarzadzaniemniejsza ilosc błedów
QsoRiX Haskell
WstepJezyk
Przykłady
HaskellKto tego uzywa?Jak to wyglada?
Historia
’88 – ustalono nazwe’98 – zamrozony release’99 – rozwiazano komitet’02 – wydano poprawiony standardzima ’08 – Rydzynski, T. zaczyna uczyc sie Haskellajesien ’08 – Rydzynski, T. zaczyna uczyc Haskella
QsoRiX Haskell
WstepJezyk
Przykłady
HaskellKto tego uzywa?Jak to wyglada?
Co to jest?
Jezyk...czysto funkcyjny:
leniwe wartosciowaniebrak efektów ubocznychbrak zmiennych
statycznie i silnie typowany
QsoRiX Haskell
WstepJezyk
Przykłady
HaskellKto tego uzywa?Jak to wyglada?
Małe porównanie
Evaluation IO Typing PureHaskell lazy monads static yesClean lazy uniqueness static yes
Miranda lazy lazy lists static yesML strict side-effects static no
Scheme strict side-effects dynamic noErlang strict side-effects dynamic1 no
http://haskell.org/haskellwiki/Comparison_of_functional_programming_languages
1with compiler annotations for static typingQsoRiX Haskell
WstepJezyk
Przykłady
HaskellKto tego uzywa?Jak to wyglada?
Kto tego uzywa?
Lista ze strony www.haskell.org:
Glasgow Haskell Compiler (GHC) – 100k lini kodu
Darcs – system kontroli wersji
Pugs – implementacja Perla 6
Credit Suisse
Amgen
Peerium, Inc
Microsoft Research
Eaton Corporation
Deutsche Bank
Antiope
ABN AMRO
Galois, Inc
Bluespec, Inc
Qualcomm, Inc
QsoRiX Haskell
WstepJezyk
Przykłady
HaskellKto tego uzywa?Jak to wyglada?
Silnia
n! =
{1 dla n = 0n(n − 1)! dla n ≥ 1
fact n | n == 0 = 1| n >= 1 = n * fact (n-1)
n! =n∏
k=1
k
fact n = product [1..n]
QsoRiX Haskell
WstepJezyk
Przykłady
HaskellKto tego uzywa?Jak to wyglada?
QuickSort
qsort [] = []qsort (x:xs) = qsort (filter (< x) xs) ++
[x] ++qsort (filter (>= x) xs)
QsoRiX Haskell
WstepJezyk
Przykłady
HaskellKto tego uzywa?Jak to wyglada?
Pochwała lenistwa
> Czesc!>> Przepraszam, ze odpisuje dopiero teraz,> ale ostatnio uczyłem sie Haskella...
pre s = "> " ++ smain = putStr.unlines.(map pre).lines=<<getContents
main = interact $ unlines . (map ("> "++)) . lines
QsoRiX Haskell
WstepJezyk
Przykłady
Podstawowe struktury danychCukierSystem typówCzesciowa aplikacja
Lista
Dowolnej długosciMoze zawierac elementy tylko jednego typuTypowa budowa: głowa i ogon
Składnia[ 1 , 2 , 3 , 4 ]1 : [ 2 , 3 , 4 ]1 : 2 : 3 : 4 : []
QsoRiX Haskell
WstepJezyk
Przykłady
Podstawowe struktury danychCukierSystem typówCzesciowa aplikacja
Krotka
Odpowiednik krotek z algebryDługosc jest okreslonaTyp elementów moze byc rózny
Składnia( 12 , GR , "tylko nie płacz prosze" )
QsoRiX Haskell
WstepJezyk
Przykłady
Podstawowe struktury danychCukierSystem typówCzesciowa aplikacja
... poza tym
W standardowej bibliotece sa miedzy innymi:ArrayByteStringGraphHashTableListMapSequenceSetTimeTree
QsoRiX Haskell
WstepJezyk
Przykłady
Podstawowe struktury danychCukierSystem typówCzesciowa aplikacja
Dopasowanie wartosci atrybutów
ack 0 y = y + 1ack x 0 = ack (x-1) 1ack x y = ack (x-1) (ack x (y-1))
fst (x, _) = xsnd (_, y) = y
QsoRiX Haskell
WstepJezyk
Przykłady
Podstawowe struktury danychCukierSystem typówCzesciowa aplikacja
Guards
sign x | x > 0 = 1| x == 0 = 0| x < 0 = -1
QsoRiX Haskell
WstepJezyk
Przykłady
Podstawowe struktury danychCukierSystem typówCzesciowa aplikacja
List comprehensions
[ (x, y) | x <- [-5..5], y <- [-x..x], x+y == 3]
[(2,1), (3,0), (4,-1), (5,-2)]
QsoRiX Haskell
WstepJezyk
Przykłady
Podstawowe struktury danychCukierSystem typówCzesciowa aplikacja
Własne operatory
a ## b = a + b + a^b(##) a b = a + b + a^b
2 ## 3 == 13
a ‘sq‘ b = a^2 + b^2sq a b = a^2 + b^2
2 ‘sq‘ 5 == 29
QsoRiX Haskell
WstepJezyk
Przykłady
Podstawowe struktury danychCukierSystem typówCzesciowa aplikacja
Silne typowanie i inferencja
Wszystkie obiekty (czyli takze funkcje) posiadaja swój typ,chociaz moze on byc dosc ogólny – polimorficznyNie trzeba podawac typów, sa one dedukowane napodstawie róznych wskazówek i operatorów z jakichbudujemy wyrazenieJawne okreslanie typu bywa bardzo pomocnym elementemdokumentujacym i czesto ułatwia prace
QsoRiX Haskell
WstepJezyk
Przykłady
Podstawowe struktury danychCukierSystem typówCzesciowa aplikacja
Typowanie - przykład
Składnia-- Nadanie stałej 10 typu Integer10 :: Integer
-- Typ funkcjiadd :: Integer -> Integer -> Integer
-- Typ polimorficzny oraz listarepeat :: a -> [a]
QsoRiX Haskell
WstepJezyk
Przykłady
Podstawowe struktury danychCukierSystem typówCzesciowa aplikacja
Inferencja - przykład
Kompilator domyslnie uzywa jak najbardziej ogólnychtypówOgraniczenia sa „dziedziczone” tak, aby typ wyrazenzłozonych był w zgodzie z typami składowych czastkowych
Mechanizm inferencjirepeat :: a -> [a]3 :: Integer
repeat 3 :: [Integer]
QsoRiX Haskell
WstepJezyk
Przykłady
Podstawowe struktury danychCukierSystem typówCzesciowa aplikacja
Inferencja - przykład c.d.
Jezeli kompilator nie moze dopasowac typów tak, abyzachowac wszystkie wymagania, sygnalizowany jest bład
Mechanizm inferencjiadd :: Integer -> Integer -> Integeradd x y = x + y
ghci> :t "foo""foo" :: [Char]
ghci> add "foo" "bar"Couldn’t match expected type ‘Integer’
against inferred type ‘[Char]’
QsoRiX Haskell
WstepJezyk
Przykłady
Podstawowe struktury danychCukierSystem typówCzesciowa aplikacja
Klasy
Skojarzenie z OOP jest mylace, chociaz z drugiej strony. . .Okreslaja zestaw operacji mozliwych do wykonania natypach wchodzacych w skład klasyPozwalaja zdefiniowac zachowania funkcji w zaleznosci odtypów argumentówPolimorfizm statyczny
QsoRiX Haskell
WstepJezyk
Przykłady
Podstawowe struktury danychCukierSystem typówCzesciowa aplikacja
Klasy - jak to działa
Klasa Eq jest czescia biblioteki standardowej. Naleza do niejtypy, które mozna porównywac.
Klasa Eqclass Eq a where(==) :: a -> a -> Bool(/=) :: a -> a -> Bool
Jesli typ jest elementem klasy Eq, mozna uzywac z nimoperatorów == i /=. I vice-versa – zeby typ był elementem klasyEq trzeba zdefiniowac, jak beda sie te operatory zachowywac.
QsoRiX Haskell
WstepJezyk
Przykłady
Podstawowe struktury danychCukierSystem typówCzesciowa aplikacja
Własne typy danych
Typy algebraiczne wprowadzane słowem kluczowym datasa odpowiednikiem struktur i unii znanych np. z C, pozatym umieja wiecejSłowem kluczowym type mozna wprowadzic synonim typu,np. type String = [Char]
Dyrektywa newtype wprowadza nowy typ wykorzystujacyreprezentacje istniejacego
Zdaze tylko wspomniec o oferowanych mozliwosciach :(
QsoRiX Haskell
WstepJezyk
Przykłady
Podstawowe struktury danychCukierSystem typówCzesciowa aplikacja
Własne typy danych - przykład
Kolorydata Kolor = Czerwony
| Niebieski| Pomaranczowy
Drzewodata Tree a = Node (Tree a) a (Tree a)
| Leaf
-- przykładtype TreeOfInts = Tree Int
QsoRiX Haskell
WstepJezyk
Przykłady
Podstawowe struktury danychCukierSystem typówCzesciowa aplikacja
Dziedziczenie klas 1/3
Byłoby miło porównywac nasze kolory...
ghci> Czerwony == Czerwony
<interactive>:1:0:No instance for (Eq Kolor)arising from a use of ‘==’
Possible fix: add an instance declarationfor (Eq Kolor)
QsoRiX Haskell
WstepJezyk
Przykłady
Podstawowe struktury danychCukierSystem typówCzesciowa aplikacja
Dziedziczenie klas 2/3
Typ do wybranej klasy mozna dodac uzywajac konstrukcjiinstance
instance Eq Kolor where(==) Czerwony Czerwony = True(==) Niebieski Niebieski = True(==) Pomaranczowy Pomaranczowy = True(==) _ _ = False
Uwierzcie na słowo, ze to działa
QsoRiX Haskell
WstepJezyk
Przykłady
Podstawowe struktury danychCukierSystem typówCzesciowa aplikacja
Dziedziczenie klas 3/3
Kolory dziedziczace Eqdata Kolor = Czerwony
| Niebieski| Pomaranczowyderiving(Eq)
Kompilator potrafi wygenerowac za nas sensowne instancje dlawszystkich klas ze standardowej biblioteki
ghci> Czerwony == CzerwonyTrueghci> Czerwony == NiebieskiFalse
QsoRiX Haskell
WstepJezyk
Przykłady
Podstawowe struktury danychCukierSystem typówCzesciowa aplikacja
Wszystko razem
Funkcja delete ma usuwac pierwsze wystapienie zadanejwartosci z listy
deletedelete x [] = []delete x (y:ys) = if x == y
then yselse y : (delete x ys)
Jakiego typu jest ta funkcja?
ghci> :t deletedelete :: (Eq a) => a -> [a] -> [a]
QsoRiX Haskell
WstepJezyk
Przykłady
Podstawowe struktury danychCukierSystem typówCzesciowa aplikacja
Podsumowanie
Statyczne typowanie zapewnia, ze skompilowany programnie posiada trywialnych błedówBrak domyslnych konwersji przekresla cała klase róznegorodzaju problemówInferencja – typowanie dostajemy bez zadnego balastuKlasy pozwalaja na tworzenie konceptów i statycznypolimorfizm<flame>Najlepszy system typów z jakim siespotkałem</flame>
„Wiekszosc kodu w Haskellu działa, o ile uda sie goskompilowac.”
QsoRiX Haskell
WstepJezyk
Przykłady
Podstawowe struktury danychCukierSystem typówCzesciowa aplikacja
Czesciowa aplikacja
Majac funkcje, która dodaje jedna liczbe do drugiej, łatwozrobic funkcje, która do liczby dodaje jedenMajac funkcje, która porównuje dwie liczby, łatwo zrobicfunkcje, która porównuje liczbe z zeremMajac funkcje, która wybiera z listy elementy spełniajacewarunek, łatwo zrobic funkcje, która wybiera z listy liczbywieksze od zera
QsoRiX Haskell
WstepJezyk
Przykłady
Podstawowe struktury danychCukierSystem typówCzesciowa aplikacja
Przykład
Łatwo zrobic funkcje, która porównuje liczbe z zerem...
(<) :: (Ord a) => a -> a -> Boolpos :: (Ord a, Num a) => a -> Bool
pos = ( 0 < )
Łatwo zrobic funkcje, która wybiera z listy liczby wieksze odzera...
filter :: (a -> Bool) -> [a] -> [a]posInts :: (Ord a, Num a) => [a] -> [a]
posInts = filter pos
QsoRiX Haskell
WstepJezyk
Przykłady
Podstawowe struktury danychCukierSystem typówCzesciowa aplikacja
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
WstepJezyk
Przykłady
Gdzie mozna poczytac
Real World Haskellwww.haskell.org
http://haskell.org/haskellwiki/Introductionhttp://haskell.org/haskellwiki/Why_Haskell_matters. . . i reszta WikiHoogle
google://Haskell
QsoRiX Haskell
WstepJezyk
Przykłady
Co za tydzien?
Krzysiek Goj
Scala3 grudnia 2008
QsoRiX Haskell
WstepJezyk
Przykłady
Koniec
Dobranoc
QsoRiX Haskell