SlideShare ist ein Scribd-Unternehmen logo
1 von 38
Downloaden Sie, um offline zu lesen
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Wstep
                        ˛
                     Jezyk
                      ˛
                 Przykłady


            ´
Co za tydzien?




                  Krzysiek Goj
                  Scala
                 3 grudnia 2008




                  QsoRiX     Haskell
Wstep
                    ˛
                 Jezyk
                  ˛
             Przykłady


Koniec




  Dobranoc



              QsoRiX     Haskell

Weitere ähnliche Inhalte

Andere mochten auch

Bazaar Mercurial
Bazaar MercurialBazaar Mercurial
Bazaar Mercurialkonryd
 
Wstęp do Subversion
Wstęp do SubversionWstęp do Subversion
Wstęp do Subversionkonryd
 
Concurrency in Python
Concurrency in PythonConcurrency in Python
Concurrency in Pythonkonryd
 
Erlang
ErlangErlang
Erlangkonryd
 
School Law Jeopardy
School Law JeopardySchool Law Jeopardy
School Law JeopardyMcCarty
 
1r trimestre ies
1r trimestre ies1r trimestre ies
1r trimestre iesjribalt1
 
School Law Power Point
School Law Power PointSchool Law Power Point
School Law Power PointMcCarty
 
Adolescent Body Image
Adolescent Body ImageAdolescent Body Image
Adolescent Body ImageMcCarty
 
Quadern tut individual 1011 3ri 4t
Quadern tut individual 1011 3ri 4tQuadern tut individual 1011 3ri 4t
Quadern tut individual 1011 3ri 4tjribalt1
 
Crear un cuenta de google
Crear un cuenta de googleCrear un cuenta de google
Crear un cuenta de googleAlexandra Ló
 
Instagran download android
Instagran download androidInstagran download android
Instagran download androidwillium236
 
Employement task 1
Employement task 1Employement task 1
Employement task 1Paigeward96
 
Recolçament a la vaga 9 de maig
Recolçament a la vaga 9 de maigRecolçament a la vaga 9 de maig
Recolçament a la vaga 9 de maigIES Algarb
 
Instagran para androide
Instagran para androideInstagran para androide
Instagran para androidewillium236
 
Iphoto process production
Iphoto process productionIphoto process production
Iphoto process productionkarank3
 

Andere mochten auch (17)

Bazaar Mercurial
Bazaar MercurialBazaar Mercurial
Bazaar Mercurial
 
Wstęp do Subversion
Wstęp do SubversionWstęp do Subversion
Wstęp do Subversion
 
Concurrency in Python
Concurrency in PythonConcurrency in Python
Concurrency in Python
 
Erlang
ErlangErlang
Erlang
 
School Law Jeopardy
School Law JeopardySchool Law Jeopardy
School Law Jeopardy
 
Scala
ScalaScala
Scala
 
1r trimestre ies
1r trimestre ies1r trimestre ies
1r trimestre ies
 
School Law Power Point
School Law Power PointSchool Law Power Point
School Law Power Point
 
Adolescent Body Image
Adolescent Body ImageAdolescent Body Image
Adolescent Body Image
 
Quadern tut individual 1011 3ri 4t
Quadern tut individual 1011 3ri 4tQuadern tut individual 1011 3ri 4t
Quadern tut individual 1011 3ri 4t
 
Crear un cuenta de google
Crear un cuenta de googleCrear un cuenta de google
Crear un cuenta de google
 
PWE
PWEPWE
PWE
 
Instagran download android
Instagran download androidInstagran download android
Instagran download android
 
Employement task 1
Employement task 1Employement task 1
Employement task 1
 
Recolçament a la vaga 9 de maig
Recolçament a la vaga 9 de maigRecolçament a la vaga 9 de maig
Recolçament a la vaga 9 de maig
 
Instagran para androide
Instagran para androideInstagran para androide
Instagran para androide
 
Iphoto process production
Iphoto process productionIphoto process production
Iphoto process production
 

Haskell

  • 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