Haskell

2,558 views

Published on

Haskell

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
2,558
On SlideShare
0
From Embeds
0
Number of Embeds
246
Actions
Shares
0
Downloads
27
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Haskell

  1. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 37. Wstep ˛ Jezyk ˛ Przykłady ´ Co za tydzien? Krzysiek Goj Scala 3 grudnia 2008 QsoRiX Haskell
  38. 38. Wstep ˛ Jezyk ˛ Przykłady Koniec Dobranoc QsoRiX Haskell

×