haskell

38
Wst ˛ ep ezyk Przyklady Haskell Tomek „QsoRiX” Rydzy´ nski [email protected] Kolo Naukowe Informatyków BIT 27 listopada 2008 / Biwak QsoRiX Haskell

Upload: konryd

Post on 12-May-2015

1.325 views

Category:

Technology


5 download

TRANSCRIPT

Page 1: Haskell

WstepJezyk

Przykłady

Haskell

Tomek „QsoRiX” [email protected]

Koło Naukowe Informatyków BIT

27 listopada 2008 / Biwak

QsoRiX Haskell

Page 2: Haskell

WstepJezyk

Przykłady

Dobry wieczór!

Nie znam Haskella...Dlatego chetnie cos o nim opowiemJesli macie pytania, smiało

QsoRiX Haskell

Page 3: 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

Page 4: 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

Page 5: 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

Page 6: 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

Page 7: 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

Page 8: 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

Page 9: 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

Page 10: 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

Page 11: 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

Page 12: 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

Page 13: 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

Page 14: 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

Page 15: Haskell

WstepJezyk

Przykłady

Podstawowe struktury danychCukierSystem typówCzesciowa aplikacja

... poza tym

W standardowej bibliotece sa miedzy innymi:ArrayByteStringGraphHashTableListMapSequenceSetTimeTree

QsoRiX Haskell

Page 16: 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

Page 17: Haskell

WstepJezyk

Przykłady

Podstawowe struktury danychCukierSystem typówCzesciowa aplikacja

Guards

sign x | x > 0 = 1| x == 0 = 0| x < 0 = -1

QsoRiX Haskell

Page 18: 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

Page 19: 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

Page 20: 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

Page 21: 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

Page 22: 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

Page 23: 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

Page 24: 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

Page 25: 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

Page 26: 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

Page 27: 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

Page 28: 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

Page 29: 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

Page 30: 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

Page 31: 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

Page 32: 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

Page 33: 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

Page 34: 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

Page 35: 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

Page 36: 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

Page 37: Haskell

WstepJezyk

Przykłady

Co za tydzien?

Krzysiek Goj

Scala3 grudnia 2008

QsoRiX Haskell

Page 38: Haskell

WstepJezyk

Przykłady

Koniec

Dobranoc

QsoRiX Haskell