SlideShare une entreprise Scribd logo
1  sur  111
Télécharger pour lire hors ligne
Wstęp
           O języku
          Przykłady




     BIWAK Scali
czyli Scala w domu i zagrodzie




          Krzysztof Goj
 Koło Naukowe Informatyków BIT
         3 grudnia 2008



       Krzysztof Goj   BIWAK Scali
Wstęp
                                         Czym jest Scala
                             O języku
                                         Hello, World!
                            Przykłady


Czym jest Scala – flame




     Lepsza Java
     Haskell dla ludzi
     Ruby, który nie muli
     Procesy Erlanga na JVM




                         Krzysztof Goj   BIWAK Scali
Wstęp
                                         Czym jest Scala
                             O języku
                                         Hello, World!
                            Przykłady


Czym jest Scala – flame




     Lepsza Java
     Haskell dla ludzi
     Ruby, który nie muli
     Procesy Erlanga na JVM




                         Krzysztof Goj   BIWAK Scali
Wstęp
                                         Czym jest Scala
                             O języku
                                         Hello, World!
                            Przykłady


Czym jest Scala – flame




     Lepsza Java
     Haskell dla ludzi
     Ruby, który nie muli
     Procesy Erlanga na JVM




                         Krzysztof Goj   BIWAK Scali
Wstęp
                                         Czym jest Scala
                             O języku
                                         Hello, World!
                            Przykłady


Czym jest Scala – flame




     Lepsza Java
     Haskell dla ludzi
     Ruby, który nie muli
     Procesy Erlanga na JVM




                         Krzysztof Goj   BIWAK Scali
Wstęp
                                       Czym jest Scala
                           O języku
                                       Hello, World!
                          Przykłady


Czym jest Scala



     Nazwa i logo
     Obiektowo-funkcyjny język programowania wysokiego
     poziomu i ogólnego przeznaczenia.
     Zgodność z Javą, wersja na .NET
     Elastyczna składnia pozwala na tworzenie DSL-i
     Stworzona przez Martina Oderskiego (EPFL)
     http://www.scala-lang.org




                       Krzysztof Goj   BIWAK Scali
Wstęp
                                       Czym jest Scala
                           O języku
                                       Hello, World!
                          Przykłady


Czym jest Scala



     Nazwa i logo
     Obiektowo-funkcyjny język programowania wysokiego
     poziomu i ogólnego przeznaczenia.
     Zgodność z Javą, wersja na .NET
     Elastyczna składnia pozwala na tworzenie DSL-i
     Stworzona przez Martina Oderskiego (EPFL)
     http://www.scala-lang.org




                       Krzysztof Goj   BIWAK Scali
Wstęp
                                       Czym jest Scala
                           O języku
                                       Hello, World!
                          Przykłady


Czym jest Scala



     Nazwa i logo
     Obiektowo-funkcyjny język programowania wysokiego
     poziomu i ogólnego przeznaczenia.
     Zgodność z Javą, wersja na .NET
     Elastyczna składnia pozwala na tworzenie DSL-i
     Stworzona przez Martina Oderskiego (EPFL)
     http://www.scala-lang.org




                       Krzysztof Goj   BIWAK Scali
Wstęp
                                      Czym jest Scala
                          O języku
                                      Hello, World!
                         Przykłady


Czym jest Scala



     Nazwa i logo
     Obiektowo-funkcyjny język programowania wysokiego
     poziomu i ogólnego przeznaczenia.
     Zgodność z Javą, wersja na .NET
     Elastyczna składnia pozwala na tworzenie DSL-i
     Stworzona przez Martina Oderskiego (EPFL)
     http://www.scala-lang.org




                      Krzysztof Goj   BIWAK Scali
Wstęp
                                       Czym jest Scala
                           O języku
                                       Hello, World!
                          Przykłady


Czym jest Scala



     Nazwa i logo
     Obiektowo-funkcyjny język programowania wysokiego
     poziomu i ogólnego przeznaczenia.
     Zgodność z Javą, wersja na .NET
     Elastyczna składnia pozwala na tworzenie DSL-i
     Stworzona przez Martina Oderskiego (EPFL)
     http://www.scala-lang.org




                       Krzysztof Goj   BIWAK Scali
Wstęp
                                       Czym jest Scala
                           O języku
                                       Hello, World!
                          Przykłady


Czym jest Scala



     Nazwa i logo
     Obiektowo-funkcyjny język programowania wysokiego
     poziomu i ogólnego przeznaczenia.
     Zgodność z Javą, wersja na .NET
     Elastyczna składnia pozwala na tworzenie DSL-i
     Stworzona przez Martina Oderskiego (EPFL)
     http://www.scala-lang.org




                       Krzysztof Goj   BIWAK Scali
Wstęp
                                     Czym jest Scala
                         O języku
                                     Hello, World!
                        Przykłady


“Hello, World!” w shellu


   Najprościej Scalę zmusić do mówienia pisząc w shellu.

  shell
  goj@abulafia ∼ % scala
  Welcome to Scala version 2.7.1.final [...]
  Type in expressions to have them evaluated.
  Type :help for more information.

  scala> println(quot;Hello, World!quot;)
  Hello, World!



                     Krzysztof Goj   BIWAK Scali
Wstęp
                                     Czym jest Scala
                         O języku
                                     Hello, World!
                        Przykłady


“Hello, World!” w shellu


   Najprościej Scalę zmusić do mówienia pisząc w shellu.

  shell
  goj@abulafia ∼ % scala
  Welcome to Scala version 2.7.1.final [...]
  Type in expressions to have them evaluated.
  Type :help for more information.

  scala> println(quot;Hello, World!quot;)
  Hello, World!



                     Krzysztof Goj   BIWAK Scali
Wstęp
                                     Czym jest Scala
                         O języku
                                     Hello, World!
                        Przykłady


“Hello, World!” w shellu


   Najprościej Scalę zmusić do mówienia pisząc w shellu.

  shell
  goj@abulafia ∼ % scala
  Welcome to Scala version 2.7.1.final [...]
  Type in expressions to have them evaluated.
  Type :help for more information.

  scala> println(quot;Hello, World!quot;)
  Hello, World!



                     Krzysztof Goj   BIWAK Scali
Wstęp
                                     Czym jest Scala
                         O języku
                                     Hello, World!
                        Przykłady


“Hello, World!” w shellu


   Najprościej Scalę zmusić do mówienia pisząc w shellu.

  shell
  goj@abulafia ∼ % scala
  Welcome to Scala version 2.7.1.final [...]
  Type in expressions to have them evaluated.
  Type :help for more information.

  scala> println(quot;Hello, World!quot;)
  Hello, World!



                     Krzysztof Goj   BIWAK Scali
Wstęp
                                     Czym jest Scala
                         O języku
                                     Hello, World!
                        Przykłady


“Hello, World!” w shellu


   Najprościej Scalę zmusić do mówienia pisząc w shellu.

  shell
  goj@abulafia ∼ % scala
  Welcome to Scala version 2.7.1.final [...]
  Type in expressions to have them evaluated.
  Type :help for more information.

  scala> println(quot;Hello, World!quot;)
  Hello, World!



                     Krzysztof Goj   BIWAK Scali
Wstęp
                                     Czym jest Scala
                         O języku
                                     Hello, World!
                        Przykłady


“Hello, World!” w shellu


   Najprościej Scalę zmusić do mówienia pisząc w shellu.

  shell
  goj@abulafia ∼ % scala
  Welcome to Scala version 2.7.1.final [...]
  Type in expressions to have them evaluated.
  Type :help for more information.

  scala> println(quot;Hello, World!quot;)
  Hello, World!



                     Krzysztof Goj   BIWAK Scali
Wstęp
                                           Czym jest Scala
                               O języku
                                           Hello, World!
                              Przykłady


“Hello, World!” jako osobny program


                    najczęściej pisze się tak. . .

  hello.scala
  object HelloWorld extends Application {
      println(quot;Hello, world!quot;)
  }

  shell
  goj@abulafia ∼ % scalac hello.scala
  goj@abulafia ∼ % ls
  Hello.class Hello$.class hello.scala
  goj@abulafia ∼ % scala -cp . Hello
  Hello, World!
  goj@abulafia ∼ % java -cp .:$SCALA_HOME/lib/scala-library.jar Hello
  Hello, World!


                           Krzysztof Goj   BIWAK Scali
Wstęp
                                           Czym jest Scala
                               O języku
                                           Hello, World!
                              Przykłady


“Hello, World!” jako osobny program


                    najczęściej pisze się tak. . .

  hello.scala
  object HelloWorld extends Application {
      println(quot;Hello, world!quot;)
  }

  shell
  goj@abulafia ∼ % scalac hello.scala
  goj@abulafia ∼ % ls
  Hello.class Hello$.class hello.scala
  goj@abulafia ∼ % scala -cp . Hello
  Hello, World!
  goj@abulafia ∼ % java -cp .:$SCALA_HOME/lib/scala-library.jar Hello
  Hello, World!


                           Krzysztof Goj   BIWAK Scali
Wstęp
                                           Czym jest Scala
                               O języku
                                           Hello, World!
                              Przykłady


“Hello, World!” jako osobny program


                    najczęściej pisze się tak. . .

  hello.scala
  object HelloWorld extends Application {
      println(quot;Hello, world!quot;)
  }

  shell
  goj@abulafia ∼ % scalac hello.scala
  goj@abulafia ∼ % ls
  Hello.class Hello$.class hello.scala
  goj@abulafia ∼ % scala -cp . Hello
  Hello, World!
  goj@abulafia ∼ % java -cp .:$SCALA_HOME/lib/scala-library.jar Hello
  Hello, World!


                           Krzysztof Goj   BIWAK Scali
Wstęp
                                           Czym jest Scala
                               O języku
                                           Hello, World!
                              Przykłady


“Hello, World!” jako osobny program


                    najczęściej pisze się tak. . .

  hello.scala
  object HelloWorld extends Application {
      println(quot;Hello, world!quot;)
  }

  shell
  goj@abulafia ∼ % scalac hello.scala
  goj@abulafia ∼ % ls
  Hello.class Hello$.class hello.scala
  goj@abulafia ∼ % scala -cp . Hello
  Hello, World!
  goj@abulafia ∼ % java -cp .:$SCALA_HOME/lib/scala-library.jar Hello
  Hello, World!


                           Krzysztof Goj   BIWAK Scali
Wstęp
                                           Czym jest Scala
                               O języku
                                           Hello, World!
                              Przykłady


“Hello, World!” jako osobny program


                    najczęściej pisze się tak. . .

  hello.scala
  object HelloWorld extends Application {
      println(quot;Hello, world!quot;)
  }

  shell
  goj@abulafia ∼ % scalac hello.scala
  goj@abulafia ∼ % ls
  Hello.class Hello$.class hello.scala
  goj@abulafia ∼ % scala -cp . Hello
  Hello, World!
  goj@abulafia ∼ % java -cp .:$SCALA_HOME/lib/scala-library.jar Hello
  Hello, World!


                           Krzysztof Goj   BIWAK Scali
Wstęp
                                           Czym jest Scala
                               O języku
                                           Hello, World!
                              Przykłady


“Hello, World!” jako osobny program


                    najczęściej pisze się tak. . .

  hello.scala
  object HelloWorld extends Application {
      println(quot;Hello, world!quot;)
  }

  shell
  goj@abulafia ∼ % scalac hello.scala
  goj@abulafia ∼ % ls
  Hello.class Hello$.class hello.scala
  goj@abulafia ∼ % scala -cp . Hello
  Hello, World!
  goj@abulafia ∼ % java -cp .:$SCALA_HOME/lib/scala-library.jar Hello
  Hello, World!


                           Krzysztof Goj   BIWAK Scali
Wstęp
                                           Czym jest Scala
                               O języku
                                           Hello, World!
                              Przykłady


“Hello, World!” jako osobny program


                    najczęściej pisze się tak. . .

  hello.scala
  object HelloWorld extends Application {
      println(quot;Hello, world!quot;)
  }

  shell
  goj@abulafia ∼ % scalac hello.scala
  goj@abulafia ∼ % ls
  Hello.class Hello$.class hello.scala
  goj@abulafia ∼ % scala -cp . Hello
  Hello, World!
  goj@abulafia ∼ % java -cp .:$SCALA_HOME/lib/scala-library.jar Hello
  Hello, World!


                           Krzysztof Goj   BIWAK Scali
Wstęp
                                           Czym jest Scala
                               O języku
                                           Hello, World!
                              Przykłady


“Hello, World!” jako osobny program


                    najczęściej pisze się tak. . .

  hello.scala
  object HelloWorld extends Application {
      println(quot;Hello, world!quot;)
  }

  shell
  goj@abulafia ∼ % scalac hello.scala
  goj@abulafia ∼ % ls
  Hello.class Hello$.class hello.scala
  goj@abulafia ∼ % scala -cp . Hello
  Hello, World!
  goj@abulafia ∼ % java -cp .:$SCALA_HOME/lib/scala-library.jar Hello
  Hello, World!


                           Krzysztof Goj   BIWAK Scali
Wstęp
                                           Czym jest Scala
                               O języku
                                           Hello, World!
                              Przykłady


“Hello, World!” jako osobny program


                    najczęściej pisze się tak. . .

  hello.scala
  object HelloWorld extends Application {
      println(quot;Hello, world!quot;)
  }

  shell
  goj@abulafia ∼ % scalac hello.scala
  goj@abulafia ∼ % ls
  Hello.class Hello$.class hello.scala
  goj@abulafia ∼ % scala -cp . Hello
  Hello, World!
  goj@abulafia ∼ % java -cp .:$SCALA_HOME/lib/scala-library.jar Hello
  Hello, World!


                           Krzysztof Goj   BIWAK Scali
Wstęp
                                           Czym jest Scala
                               O języku
                                           Hello, World!
                              Przykłady


“Hello, World!” jako osobny program


                    najczęściej pisze się tak. . .

  hello.scala
  object HelloWorld extends Application {
      println(quot;Hello, world!quot;)
  }

  shell
  goj@abulafia ∼ % scalac hello.scala
  goj@abulafia ∼ % ls
  Hello.class Hello$.class hello.scala
  goj@abulafia ∼ % scala -cp . Hello
  Hello, World!
  goj@abulafia ∼ % java -cp .:$SCALA_HOME/lib/scala-library.jar Hello
  Hello, World!


                           Krzysztof Goj   BIWAK Scali
Wstęp
                                           Czym jest Scala
                               O języku
                                           Hello, World!
                              Przykłady


“Hello, World!” jako osobny program


                    najczęściej pisze się tak. . .

  hello.scala
  object HelloWorld extends Application {
      println(quot;Hello, world!quot;)
  }

  shell
  goj@abulafia ∼ % scalac hello.scala
  goj@abulafia ∼ % ls
  Hello.class Hello$.class hello.scala
  goj@abulafia ∼ % scala -cp . Hello
  Hello, World!
  goj@abulafia ∼ % java -cp .:$SCALA_HOME/lib/scala-library.jar Hello
  Hello, World!


                           Krzysztof Goj   BIWAK Scali
Wstęp
                                                      Czym jest Scala
                                          O języku
                                                      Hello, World!
                                         Przykłady


“Hello, World!” jako skrypt

                          . . . można też pisać skrypty

  script.sh
  #!/bin/sh
  exec scala quot;$0quot; quot;$¨
  !#

  object HelloWorld {
    def main(args: Array[String]) {
      println(quot;Hello, World!quot;)
    }
  }
  HelloWorld.main(args)



  shell
  goj@abulafia ∼ %        chmod +x script.sh
  goj@abulafia ∼ %        ./script.sh
  Hello, World!


                                      Krzysztof Goj   BIWAK Scali
Wstęp
                                                      Czym jest Scala
                                          O języku
                                                      Hello, World!
                                         Przykłady


“Hello, World!” jako skrypt

                          . . . można też pisać skrypty

  script.sh
  #!/bin/sh
  exec scala quot;$0quot; quot;$¨
  !#

  object HelloWorld {
    def main(args: Array[String]) {
      println(quot;Hello, World!quot;)
    }
  }
  HelloWorld.main(args)



  shell
  goj@abulafia ∼ %        chmod +x script.sh
  goj@abulafia ∼ %        ./script.sh
  Hello, World!


                                      Krzysztof Goj   BIWAK Scali
Wstęp
                                                      Czym jest Scala
                                          O języku
                                                      Hello, World!
                                         Przykłady


“Hello, World!” jako skrypt

                          . . . można też pisać skrypty

  script.sh
  #!/bin/sh
  exec scala quot;$0quot; quot;$¨
  !#

  object HelloWorld {
    def main(args: Array[String]) {
      println(quot;Hello, World!quot;)
    }
  }
  HelloWorld.main(args)



  shell
  goj@abulafia ∼ %        chmod +x script.sh
  goj@abulafia ∼ %        ./script.sh
  Hello, World!


                                      Krzysztof Goj   BIWAK Scali
Wstęp
                                                      Czym jest Scala
                                          O języku
                                                      Hello, World!
                                         Przykłady


“Hello, World!” jako skrypt

                          . . . można też pisać skrypty

  script.sh
  #!/bin/sh
  exec scala quot;$0quot; quot;$¨
  !#

  object HelloWorld {
    def main(args: Array[String]) {
      println(quot;Hello, World!quot;)
    }
  }
  HelloWorld.main(args)



  shell
  goj@abulafia ∼ %        chmod +x script.sh
  goj@abulafia ∼ %        ./script.sh
  Hello, World!


                                      Krzysztof Goj   BIWAK Scali
Wstęp
                                                      Czym jest Scala
                                          O języku
                                                      Hello, World!
                                         Przykłady


“Hello, World!” jako skrypt

                          . . . można też pisać skrypty

  script.sh
  #!/bin/sh
  exec scala quot;$0quot; quot;$¨
  !#

  object HelloWorld {
    def main(args: Array[String]) {
      println(quot;Hello, World!quot;)
    }
  }
  HelloWorld.main(args)



  shell
  goj@abulafia ∼ %        chmod +x script.sh
  goj@abulafia ∼ %        ./script.sh
  Hello, World!


                                      Krzysztof Goj   BIWAK Scali
Wstęp
                                                      Czym jest Scala
                                          O języku
                                                      Hello, World!
                                         Przykłady


“Hello, World!” jako skrypt

                          . . . można też pisać skrypty

  script.sh
  #!/bin/sh
  exec scala quot;$0quot; quot;$¨
  !#

  object HelloWorld {
    def main(args: Array[String]) {
      println(quot;Hello, World!quot;)
    }
  }
  HelloWorld.main(args)



  shell
  goj@abulafia ∼ %        chmod +x script.sh
  goj@abulafia ∼ %        ./script.sh
  Hello, World!


                                      Krzysztof Goj   BIWAK Scali
Wstęp
                                                      Czym jest Scala
                                          O języku
                                                      Hello, World!
                                         Przykłady


“Hello, World!” jako skrypt

                          . . . można też pisać skrypty

  script.sh
  #!/bin/sh
  exec scala quot;$0quot; quot;$¨
  !#

  object HelloWorld {
    def main(args: Array[String]) {
      println(quot;Hello, World!quot;)
    }
  }
  HelloWorld.main(args)



  shell
  goj@abulafia ∼ %        chmod +x script.sh
  goj@abulafia ∼ %        ./script.sh
  Hello, World!


                                      Krzysztof Goj   BIWAK Scali
Wstęp     Programowanie funkcyjne
                             O języku    Elastyczna Składnia
                            Przykłady    Inne


Fundamenty programowania funkcyjnego



     Funkcje to zwykłe obiekty
       • Można je przekazywać jako argumenty do funkcji
       • Mogą być zwracane przez inne funkcje
       • Programujemy składając je na różne sposoby
     Izolowanie efektów ubocznych
       • Niezmienność (immutability)
       • Programujemy tworząc nowe obiekty na podstawie starych,
         a nie zmieniając istniejące




                         Krzysztof Goj   BIWAK Scali
Wstęp     Programowanie funkcyjne
                             O języku    Elastyczna Składnia
                            Przykłady    Inne


Fundamenty programowania funkcyjnego



     Funkcje to zwykłe obiekty
       • Można je przekazywać jako argumenty do funkcji
       • Mogą być zwracane przez inne funkcje
       • Programujemy składając je na różne sposoby
     Izolowanie efektów ubocznych
       • Niezmienność (immutability)
       • Programujemy tworząc nowe obiekty na podstawie starych,
         a nie zmieniając istniejące




                         Krzysztof Goj   BIWAK Scali
Wstęp     Programowanie funkcyjne
                             O języku    Elastyczna Składnia
                            Przykłady    Inne


Fundamenty programowania funkcyjnego



     Funkcje to zwykłe obiekty
       • Można je przekazywać jako argumenty do funkcji
       • Mogą być zwracane przez inne funkcje
       • Programujemy składając je na różne sposoby
     Izolowanie efektów ubocznych
       • Niezmienność (immutability)
       • Programujemy tworząc nowe obiekty na podstawie starych,
         a nie zmieniając istniejące




                         Krzysztof Goj   BIWAK Scali
Wstęp     Programowanie funkcyjne
                             O języku    Elastyczna Składnia
                            Przykłady    Inne


Fundamenty programowania funkcyjnego



     Funkcje to zwykłe obiekty
       • Można je przekazywać jako argumenty do funkcji
       • Mogą być zwracane przez inne funkcje
       • Programujemy składając je na różne sposoby
     Izolowanie efektów ubocznych
       • Niezmienność (immutability)
       • Programujemy tworząc nowe obiekty na podstawie starych,
         a nie zmieniając istniejące




                         Krzysztof Goj   BIWAK Scali
Wstęp     Programowanie funkcyjne
                           O języku    Elastyczna Składnia
                          Przykłady    Inne


Fundamenty programowania funkcyjnego



     Funkcje to zwykłe obiekty
       • Można je przekazywać jako argumenty do funkcji
       • Mogą być zwracane przez inne funkcje
       • Programujemy składając je na różne sposoby
     Izolowanie efektów ubocznych
       • Niezmienność (immutability)
       • Programujemy tworząc nowe obiekty na podstawie
         starych, a nie zmieniając istniejące




                       Krzysztof Goj   BIWAK Scali
Wstęp     Programowanie funkcyjne
                             O języku    Elastyczna Składnia
                            Przykłady    Inne


Fundamenty programowania funkcyjnego



     Funkcje to zwykłe obiekty
       • Można je przekazywać jako argumenty do funkcji
       • Mogą być zwracane przez inne funkcje
       • Programujemy składając je na różne sposoby
     Izolowanie efektów ubocznych
       • Niezmienność (immutability)
       • Programujemy tworząc nowe obiekty na podstawie starych,
         a nie zmieniając istniejące




                         Krzysztof Goj   BIWAK Scali
Wstęp     Programowanie funkcyjne
                           O języku    Elastyczna Składnia
                          Przykłady    Inne


Fundamenty programowania funkcyjnego



     Funkcje to zwykłe obiekty
       • Można je przekazywać jako argumenty do funkcji
       • Mogą być zwracane przez inne funkcje
       • Programujemy składając je na różne sposoby
     Izolowanie efektów ubocznych
       • Niezmienność (immutability)
       • Programujemy tworząc nowe obiekty na podstawie
         starych, a nie zmieniając istniejące




                       Krzysztof Goj   BIWAK Scali
Wstęp     Programowanie funkcyjne
                            O języku    Elastyczna Składnia
                           Przykłady    Inne


Zalety programowania funkcyjnego




     Skalowalność
     Zwięzłość
     Naturalny sposób opisu wielu problemów
     Jest trędi–dżezi, kul, na topie




                        Krzysztof Goj   BIWAK Scali
Wstęp     Programowanie funkcyjne
                            O języku    Elastyczna Składnia
                           Przykłady    Inne


Zalety programowania funkcyjnego




     Skalowalność
     Zwięzłość
     Naturalny sposób opisu wielu problemów
     Jest trędi–dżezi, kul, na topie




                        Krzysztof Goj   BIWAK Scali
Wstęp     Programowanie funkcyjne
                            O języku    Elastyczna Składnia
                           Przykłady    Inne


Zalety programowania funkcyjnego




     Skalowalność
     Zwięzłość
     Naturalny sposób opisu wielu problemów
     Jest trędi–dżezi, kul, na topie




                        Krzysztof Goj   BIWAK Scali
Wstęp     Programowanie funkcyjne
                           O języku    Elastyczna Składnia
                          Przykłady    Inne


Zalety programowania funkcyjnego




     Skalowalność
     Zwięzłość
     Naturalny sposób opisu wielu problemów
     Jest trędi–dżezi, kul, na topie




                       Krzysztof Goj   BIWAK Scali
Wstęp     Programowanie funkcyjne
                         O języku    Elastyczna Składnia
                        Przykłady    Inne


Co to jest DSL?




     Domain Specific Languages
     Zewnętrzne (np. Make)
     Wewnętrzne (np. Rake)




                     Krzysztof Goj   BIWAK Scali
Wstęp     Programowanie funkcyjne
                         O języku    Elastyczna Składnia
                        Przykłady    Inne


Co to jest DSL?




     Domain Specific Languages
     Zewnętrzne (np. Make)
     Wewnętrzne (np. Rake)




                     Krzysztof Goj   BIWAK Scali
Wstęp     Programowanie funkcyjne
                         O języku    Elastyczna Składnia
                        Przykłady    Inne


Co to jest DSL?




     Domain Specific Languages
     Zewnętrzne (np. Make)
     Wewnętrzne (np. Rake)




                     Krzysztof Goj   BIWAK Scali
Wstęp     Programowanie funkcyjne
                               O języku    Elastyczna Składnia
                              Przykłady    Inne


Co to jest DSL?



  Wewnętrzny DSL w Scali — Specs
  object helloWorld extends Specification {
    quot;’Hello, World!’ has 13 charactersquot; in {
       quot;Hello, World!quot;.size mustEqual 13
    }
    quot;’Hello, World!’ matches /H.*W.*d.?/ regexpquot; in {
       quot;Hello, World!quot; must beMatching(quot;H.*W.*d.?quot;)
    }

  }




                           Krzysztof Goj   BIWAK Scali
Wstęp     Programowanie funkcyjne
                             O języku    Elastyczna Składnia
                            Przykłady    Inne


Scala a współbieżność




     scala.actors
     scala.concurrent
       • scala.concurrent.pilib – rachunek π
       • scala.concurrent.jolib – join calculus
       • Lock, SyncChannel

     Scala-STM (poza biblioteką standardową)




                         Krzysztof Goj   BIWAK Scali
Wstęp     Programowanie funkcyjne
                            O języku    Elastyczna Składnia
                           Przykłady    Inne


Scala a współbieżność




     scala.actors
     scala.concurrent
       • scala.concurrent.pilib – rachunek π
       • scala.concurrent.jolib – join calculus
       • Lock, SyncChannel

     Scala-STM (poza biblioteką standardową)




                        Krzysztof Goj   BIWAK Scali
Wstęp     Programowanie funkcyjne
                            O języku    Elastyczna Składnia
                           Przykłady    Inne


Scala a współbieżność




     scala.actors
     scala.concurrent
       • scala.concurrent.pilib – rachunek π
       • scala.concurrent.jolib – join calculus
       • Lock, SyncChannel

     Scala-STM (poza biblioteką standardową)




                        Krzysztof Goj   BIWAK Scali
Wstęp     Programowanie funkcyjne
                            O języku    Elastyczna Składnia
                           Przykłady    Inne


Scala a współbieżność




     scala.actors
     scala.concurrent
       • scala.concurrent.pilib – rachunek π
       • scala.concurrent.jolib – join calculus
       • Lock, SyncChannel

     Scala-STM (poza biblioteką standardową)




                        Krzysztof Goj   BIWAK Scali
Wstęp     Programowanie funkcyjne
                             O języku    Elastyczna Składnia
                            Przykłady    Inne


Scala a współbieżność




     scala.actors
     scala.concurrent
       • scala.concurrent.pilib – rachunek π
       • scala.concurrent.jolib – join calculus
       • Lock, SyncChannel

     Scala-STM (poza biblioteką standardową)




                         Krzysztof Goj   BIWAK Scali
Wstęp     Programowanie funkcyjne
                             O języku    Elastyczna Składnia
                            Przykłady    Inne


Scala a współbieżność




     scala.actors
     scala.concurrent
       • scala.concurrent.pilib – rachunek π
       • scala.concurrent.jolib – join calculus
       • Lock, SyncChannel

     Scala-STM (poza biblioteką standardową)




                         Krzysztof Goj   BIWAK Scali
Wstęp     Programowanie funkcyjne
                        O języku    Elastyczna Składnia
                       Przykłady    Inne




traity
pattern matching
składnia dla XML-a
inferencja typów
domknięcia funkcyjne
funkcje anonimowe
implicit conversions
implicit parameters
for comprehensions i monady
elastyczny system typów



                    Krzysztof Goj   BIWAK Scali
Wstęp     rozgrzewka
    O języku    ciekawsze
   Przykłady    przerażające




  Przykłady




Krzysztof Goj   BIWAK Scali
Wstęp     rozgrzewka
                                 O języku    ciekawsze
                                Przykłady    przerażające


Na rozgrzewkę - map

  Haskell
  map (1+) [1, 2, 3]

  Ruby
  [1, 2, 3].map {|i| i+1}

  Scheme (Lisp)
  (map (lambda (n) (1+ n)) ’(1 2 3))

  Python
  [n+1 for n in [1, 2, 3]]

  Erlang
  lists:map(fun(N) -> N+1 end, [1, 2, 3]).



                             Krzysztof Goj   BIWAK Scali
Wstęp    rozgrzewka
                                         O języku   ciekawsze
                                        Przykłady   przerażające


Na rozgrzewkę - map

  Java
  import java.util.List;
  import java.util.ArrayList;
  import static java.util.Arrays.asList;

  interface Function<Result, Arg> {
      public Result execute(Arg arg);
  }

  public class MapExample {
      public static<Result, Arg> List<Result> map(Function<Result, Arg> fn, Iterable<Arg> iter) {
          List<Result> result = new ArrayList<Result>();
          for (Arg i: iter)
              result.add(fn.execute(i));
          return result;
      }

      public static void main(String[] args) {
          map(new Function<Integer, Integer>() {
              public Integer execute(Integer i) {
                  return i + 1;
              }
          }, asList(1, 2, 3));
      }
  }



                                    Krzysztof Goj   BIWAK Scali
Wstęp     rozgrzewka
                               O języku    ciekawsze
                              Przykłady    przerażające


Na rozgrzewkę - map
  Scala
  object MapExample extends Application {
    def increase(n: Int): Int = {
      return n + 1;
    }
    Array(1, 2, 3).map(increase);
  }

  Scala — którka funkcja
  object MapExample extends Application {
    def increase(n: Int): Int = n + 1;
    Array(1, 2, 3).map(increase);
  }

  Scala — inferencja typów
  object MapExample extends Application {
    def increase(n: Int) = n + 1;
    Array(1, 2, 3).map(increase);
  }

                           Krzysztof Goj   BIWAK Scali
Wstęp     rozgrzewka
                               O języku    ciekawsze
                              Przykłady    przerażające


Na rozgrzewkę - map
  Scala
  object MapExample extends Application {
    def increase(n: Int): Int = {
      return n + 1;
    }
    Array(1, 2, 3).map(increase);
  }

  Scala — którka funkcja
  object MapExample extends Application {
    def increase(n: Int): Int = n + 1;
    Array(1, 2, 3).map(increase);
  }

  Scala — inferencja typów
  object MapExample extends Application {
    def increase(n: Int) = n + 1;
    Array(1, 2, 3).map(increase);
  }

                           Krzysztof Goj   BIWAK Scali
Wstęp     rozgrzewka
                               O języku    ciekawsze
                              Przykłady    przerażające


Na rozgrzewkę - map
  Scala
  object MapExample extends Application {
    def increase(n: Int): Int = {
      return n + 1;
    }
    Array(1, 2, 3).map(increase);
  }

  Scala — którka funkcja
  object MapExample extends Application {
    def increase(n: Int): Int = n + 1;
    Array(1, 2, 3).map(increase);
  }

  Scala — inferencja typów
  object MapExample extends Application {
    def increase(n: Int) = n + 1;
    Array(1, 2, 3).map(increase);
  }

                           Krzysztof Goj   BIWAK Scali
Wstęp     rozgrzewka
                                O języku    ciekawsze
                               Przykłady    przerażające


Na rozgrzewkę - map

  to samo, co na poprzednim slajdzie
  def increase(n: Int) = n + 1;
  Array(1, 2, 3).map(increase);

  funkcja anonimowa
  Array(1, 2, 3).map((n: Int) => n + 1);

  dalsza inferencja typów
  Array(1, 2, 3).map(n => n + 1);

  anonimowy argument
  Array(1, 2, 3).map(_ + 1);

  wygodna składnia
  Array(1, 2, 3) map (_ + 1)


                            Krzysztof Goj   BIWAK Scali
Wstęp     rozgrzewka
                                O języku    ciekawsze
                               Przykłady    przerażające


Na rozgrzewkę - map

  to samo, co na poprzednim slajdzie
  def increase(n: Int) = n + 1;
  Array(1, 2, 3).map(increase);

  funkcja anonimowa
  Array(1, 2, 3).map((n: Int) => n + 1);

  dalsza inferencja typów
  Array(1, 2, 3).map(n => n + 1);

  anonimowy argument
  Array(1, 2, 3).map(_ + 1);

  wygodna składnia
  Array(1, 2, 3) map (_ + 1)


                            Krzysztof Goj   BIWAK Scali
Wstęp     rozgrzewka
                                O języku    ciekawsze
                               Przykłady    przerażające


Na rozgrzewkę - map

  to samo, co na poprzednim slajdzie
  def increase(n: Int) = n + 1;
  Array(1, 2, 3).map(increase);

  funkcja anonimowa
  Array(1, 2, 3).map((n: Int) => n + 1);

  dalsza inferencja typów
  Array(1, 2, 3).map(n => n + 1);

  anonimowy argument
  Array(1, 2, 3).map(_ + 1);

  wygodna składnia
  Array(1, 2, 3) map (_ + 1)


                            Krzysztof Goj   BIWAK Scali
Wstęp     rozgrzewka
                                O języku    ciekawsze
                               Przykłady    przerażające


Na rozgrzewkę - map

  to samo, co na poprzednim slajdzie
  def increase(n: Int) = n + 1;
  Array(1, 2, 3).map(increase);

  funkcja anonimowa
  Array(1, 2, 3).map((n: Int) => n + 1);

  dalsza inferencja typów
  Array(1, 2, 3).map(n => n + 1);

  anonimowy argument
  Array(1, 2, 3).map(_ + 1);

  wygodna składnia
  Array(1, 2, 3) map (_ + 1)


                            Krzysztof Goj   BIWAK Scali
Wstęp     rozgrzewka
                                O języku    ciekawsze
                               Przykłady    przerażające


Na rozgrzewkę - map

  to samo, co na poprzednim slajdzie
  def increase(n: Int) = n + 1;
  Array(1, 2, 3).map(increase);

  funkcja anonimowa
  Array(1, 2, 3).map((n: Int) => n + 1);

  dalsza inferencja typów
  Array(1, 2, 3).map(n => n + 1);

  anonimowy argument
  Array(1, 2, 3).map(_ + 1);

  wygodna składnia
  Array(1, 2, 3) map (_ + 1)


                            Krzysztof Goj   BIWAK Scali
Wstęp     rozgrzewka
                               O języku    ciekawsze
                              Przykłady    przerażające


takaSkładnia.setJestBrzydka(true)


  Settery i gettery
  class DateError extends Exception
  class TimeOfDayVar {
    private var h, m, s: Int = 0
    def hours = h
    def hours_= (h: Int) =
      if (0 <= h && h < 24) this.h = h
      else throw new DateError()
      // ...
  }

  def main(args: Array[String]) {
    val d = new TimeOfDayVar
    d.hours = 8; d.minutes = 30; d.seconds = 0
    d.hours = 25 // throws a DateError exception
  }




                           Krzysztof Goj   BIWAK Scali
Wstęp     rozgrzewka
                               O języku    ciekawsze
                              Przykłady    przerażające


Implicit Conversions



  silnia
  def fact(n: Int): BigInt = if (n > 0) BigInt(n) * fact(n-1) else 1
  implicit def enrich(n: Int) = new {
    def !(): BigInt = fact(n)
  }

  println(42!)

  1405006117752879898543142606244511569936384000000000




                           Krzysztof Goj   BIWAK Scali
Wstęp     rozgrzewka
                               O języku    ciekawsze
                              Przykłady    przerażające


Implicit Conversions



  silnia
  def fact(n: Int): BigInt = if (n > 0) BigInt(n) * fact(n-1) else 1
  implicit def enrich(n: Int) = new {
    def !(): BigInt = fact(n)
  }

  println(42!)

  1405006117752879898543142606244511569936384000000000




                           Krzysztof Goj   BIWAK Scali
Wstęp     rozgrzewka
                               O języku    ciekawsze
                              Przykłady    przerażające


For Comprehensions


  sprytne pętle
  for (i <- 1 to 100 by 7) println(i)
  for (i <- 1 to 100 by 7 if i % 3 == 0) println(i)
  val numbers = for (i <- 1 to 100 by 7 if i % 3 == 0) yield i-1


  odcukrzamy
  (1).to(100).by(7).foreach(println)
  (1).to(100).by(7).filter(_ % 3 == 0).foreach(println)
  val numbers = (1).to(100).by(7).filter(_ % 3 == 0).map(_-1)




                           Krzysztof Goj   BIWAK Scali
Wstęp     rozgrzewka
                               O języku    ciekawsze
                              Przykłady    przerażające


For Comprehensions


  sprytne pętle
  for (i <- 1 to 100 by 7) println(i)
  for (i <- 1 to 100 by 7 if i % 3 == 0) println(i)
  val numbers = for (i <- 1 to 100 by 7 if i % 3 == 0) yield i-1


  odcukrzamy
  (1).to(100).by(7).foreach(println)
  (1).to(100).by(7).filter(_ % 3 == 0).foreach(println)
  val numbers = (1).to(100).by(7).filter(_ % 3 == 0).map(_-1)




                           Krzysztof Goj   BIWAK Scali
Wstęp     rozgrzewka
                               O języku    ciekawsze
                              Przykłady    przerażające


For Comprehensions


  sprytne pętle
  for (i <- 1 to 100 by 7) println(i)
  for (i <- 1 to 100 by 7 if i % 3 == 0) println(i)
  val numbers = for (i <- 1 to 100 by 7 if i % 3 == 0) yield i-1


  odcukrzamy
  (1).to(100).by(7).foreach(println)
  (1).to(100).by(7).filter(_ % 3 == 0).foreach(println)
  val numbers = (1).to(100).by(7).filter(_ % 3 == 0).map(_-1)




                           Krzysztof Goj   BIWAK Scali
Wstęp     rozgrzewka
                               O języku    ciekawsze
                              Przykłady    przerażające


For Comprehensions


  sprytne pętle
  for (i <- 1 to 100 by 7) println(i)
  for (i <- 1 to 100 by 7 if i % 3 == 0) println(i)
  val numbers = for (i <- 1 to 100 by 7 if i % 3 == 0) yield i-1


  odcukrzamy
  (1).to(100).by(7).foreach(println)
  (1).to(100).by(7).filter(_ % 3 == 0).foreach(println)
  val numbers = (1).to(100).by(7).filter(_ % 3 == 0).map(_-1)




                           Krzysztof Goj   BIWAK Scali
Wstęp     rozgrzewka
                               O języku    ciekawsze
                              Przykłady    przerażające


Opcje



  Opcje
  import scala.collection.mutable.HashMap
  val numbers = HashMap(0 -> quot;nicquot;, 1 -> quot;jednoquot;, 2 -> quot;dwaquot;)
  val rnd = new Random

  numbers get rnd.nextInt(7) match {
    case Some(name) => println(quot;To quot; + name)
    case None       => println(quot;Dużoquot;)
  }

  println(numbers get rnd.nextInt(7) map {_.capitalize + quot;!quot;}
                 getOrElse quot;DUŻO!!!quot;)




                           Krzysztof Goj   BIWAK Scali
Wstęp     rozgrzewka
                                 O języku    ciekawsze
                                Przykłady    przerażające


ScalaCheck — QuickCheck i więcej
  ScalaCheck
  import org.scalacheck._

  object StringSpecification extends Properties(quot;Stringquot;) {
    specify(quot;startsWithquot;, (a: String, b: String) => (a+b).startsWith(a))

      specify(quot;endsWithquot;, (a: String, b: String) => (a+b).endsWith(b))

      // Is this really always true?
      specify(quot;concatquot;, (a: String, b: String) =>
        (a+b).length > a.length && (a+b).length > b.length
      )

      specify(quot;substringquot;, (a: String, b: String) =>
        (a+b).substring(a.length) == b
      )

      specify(quot;substringquot;, (a: String, b: String, c: String) =>
        (a+b+c).substring(a.length, a.length+b.length) == b
      )
  }
                             Krzysztof Goj   BIWAK Scali
Wstęp     rozgrzewka
                                 O języku    ciekawsze
                                Przykłady    przerażające


Traity

  Trait ordered
  trait   Ordered[A] {
    def   compare(that: A): Int
    def   < (that: A): Boolean =    (this compare that)     <    0
    def   > (that: A): Boolean =    (this compare that)     >    0
    def   <= (that: A): Boolean =   (this compare that)     <=   0
    def   >= (that: A): Boolean =   (this compare that)     >=   0
    def   compareTo(that: A): Int   = compare(that)
  }

  Użycie
  class Sth(val a: Int) extends Ordered[Sth] {
    override def compare(other: Sth) = {
      val b = other.a
      (a*a) compare (b*b)
    }
  }
  val rnd = new Random
  println(if (new Sth(-3) < new Sth(rnd nextInt 5)) quot;Yesquot; else quot;Noquot;)

                             Krzysztof Goj   BIWAK Scali
Wstęp     rozgrzewka
                                 O języku    ciekawsze
                                Przykłady    przerażające


Traity

  Trait ordered
  trait   Ordered[A] {
    def   compare(that: A): Int
    def   < (that: A): Boolean =    (this compare that)     <    0
    def   > (that: A): Boolean =    (this compare that)     >    0
    def   <= (that: A): Boolean =   (this compare that)     <=   0
    def   >= (that: A): Boolean =   (this compare that)     >=   0
    def   compareTo(that: A): Int   = compare(that)
  }

  Użycie
  class Sth(val a: Int) extends Ordered[Sth] {
    override def compare(other: Sth) = {
      val b = other.a
      (a*a) compare (b*b)
    }
  }
  val rnd = new Random
  println(if (new Sth(-3) < new Sth(rnd nextInt 5)) quot;Yesquot; else quot;Noquot;)

                             Krzysztof Goj   BIWAK Scali
Wstęp     rozgrzewka
                               O języku    ciekawsze
                              Przykłady    przerażające


Domknięcia



  Zapis
  var counter = 0
  def bump_up() {
    counter += 1
  }

  Odczyt
  def outer(a: Int): Int = {
    def helper(b: Int) = a * a - b
    helper(4) + helper(a-1)
  }




                           Krzysztof Goj   BIWAK Scali
Wstęp     rozgrzewka
                               O języku    ciekawsze
                              Przykłady    przerażające


Domknięcia



  Zapis
  var counter = 0
  def bump_up() {
    counter += 1
  }

  Odczyt
  def outer(a: Int): Int = {
    def helper(b: Int) = a * a - b
    helper(4) + helper(a-1)
  }




                           Krzysztof Goj   BIWAK Scali
Wstęp     rozgrzewka
                                  O języku    ciekawsze
                                 Przykłady    przerażające


Domknięcia

  Licznik — patologicznik
  def mkCounter() = {
    var soFar = 0
    def counter(n: Int) = {
      soFar += n
      soFar
    }
    counter _
  }

  val cnt1 = mkCounter()
  val cnt2 = mkCounter()
  cnt1(1); cnt1(30)
  println(cnt1(11))
  println(cnt2(7))

  wypisze 42 i 7


                              Krzysztof Goj   BIWAK Scali
Wstęp     rozgrzewka
                                 O języku    ciekawsze
                                Przykłady    przerażające


XML – tworzenie

  XML
  case class Person(name: String, age: Int)
  class AddressBook(a: Person*) {
    private val people: List[Person] = a.toList

      def toXHTML =
        <table class=quot;XMLquot;>
          <tr>
            <th>Last Name</th>
            <th>First Name</th>
          </tr>
          { for (val p <- people) yield
              <tr>
                <td>{ p.name }</td>
                <td>{ p.age.toString }</td>
              </tr>
          }
        </table>;
  }


                             Krzysztof Goj   BIWAK Scali
Wstęp     rozgrzewka
                                        O języku    ciekawsze
                                       Przykłady    przerażające


XML – wyszukiwanie 1/3



  XML
  def understandFakt(note: scala.xml.Node): String = note match {
    case <murder>
           <criminal>
             <name>{murdererName}</name>
             <age>{murderAge}</age>
           </criminal>
           <victim><name>{victimName}</name>{_*}</victim>
         </murder> => quot;ZBRODNIA! quot; + murderAge + quot;-letni quot; +
                      murderAge + quot; zabił quot; + quot; quot; + victimName
    case <advert>{content}</advert> => quot;Kupuj quot; + content
    case _ => quot;prognoza pogody: będzie padaćquot;
  }




                                    Krzysztof Goj   BIWAK Scali
Wstęp     rozgrzewka
                                        O języku    ciekawsze
                                       Przykłady    przerażające


XML – wyszukiwanie 2/3



  XML
  val stuff =
    <badStuff>
      <newspapers>
        <newspaper title=quot;Nasz Dziennikquot;>...</newspaper>
        <newspaper title=quot;NIEquot;>...</newspaper>
        <newspaper title=quot;Faktquot;>
          <frontPage>
            <advert>Fakt</advert>
            <pogoda/>
          </frontPage>
        </newspaper>
      </newspapers>
    </badStuff>




                                    Krzysztof Goj   BIWAK Scali
Wstęp       rozgrzewka
                                        O języku      ciekawsze
                                       Przykłady      przerażające


XML – wyszukiwanie 3/3




  XML
  for {
    val paper <- stuff  quot;newspapersquot;  quot;newspaperquot;
    paper.attributes(quot;titlequot;) == quot;Faktquot;
    val frontPage <- paper  quot;frontPagequot;
    val article <- frontPage child
  } println(understandFakt(article))




                                    Krzysztof Goj     BIWAK Scali
Wstęp     rozgrzewka
                               O języku    ciekawsze
                              Przykłady    przerażające


Kowariancja i dolna granica typu


  Stos – definicja
  class Stack[+A] {
    def push[B >: A](elem: B): Stack[B] = new Stack[B] {
      override def top: B = elem
      override def pop: Stack[B] = Stack.this
      override def toString() = Stack.this.toString() +
                                 quot; quot; + elem.toString()
    }
    def top: A = error(quot;no element on stackquot;)
    def pop: Stack[A] = error(quot;no element on stackquot;)
    override def toString() = quot;quot;
  }

    hierarchia klas




                           Krzysztof Goj   BIWAK Scali
Wstęp     rozgrzewka
                                O języku    ciekawsze
                               Przykłady    przerażające


Kowariancja i dolna granica typu


  Stos – użycie
  scala> :load examples/stack.scala
  Loading examples/stack.scala...
  defined class Stack

  scala> new Stack
  res0: Stack[Nothing] =

  scala> res0 push quot;Alaquot; push quot;maquot; push quot;kotaquot;
  res1: Stack[java.lang.String] = Ala ma kota

  scala> res1 pop
  res2: Stack[java.lang.String] =      Ala ma

  scala> res2 push 0
  res3: Stack[Any] =   Ala ma 0




                            Krzysztof Goj   BIWAK Scali
Wstęp     rozgrzewka
                                O języku    ciekawsze
                               Przykłady    przerażające


Kowariancja i dolna granica typu


  Stos – użycie
  scala> :load examples/stack.scala
  Loading examples/stack.scala...
  defined class Stack

  scala> new Stack
  res0: Stack[Nothing] =

  scala> res0 push quot;Alaquot; push quot;maquot; push quot;kotaquot;
  res1: Stack[java.lang.String] = Ala ma kota

  scala> res1 pop
  res2: Stack[java.lang.String] =      Ala ma

  scala> res2 push 0
  res3: Stack[Any] =   Ala ma 0




                            Krzysztof Goj   BIWAK Scali
Wstęp     rozgrzewka
                                O języku    ciekawsze
                               Przykłady    przerażające


Kowariancja i dolna granica typu


  Stos – użycie
  scala> :load examples/stack.scala
  Loading examples/stack.scala...
  defined class Stack

  scala> new Stack
  res0: Stack[Nothing] =

  scala> res0 push quot;Alaquot; push quot;maquot; push quot;kotaquot;
  res1: Stack[java.lang.String] = Ala ma kota

  scala> res1 pop
  res2: Stack[java.lang.String] =      Ala ma

  scala> res2 push 0
  res3: Stack[Any] =   Ala ma 0




                            Krzysztof Goj   BIWAK Scali
Wstęp     rozgrzewka
                                O języku    ciekawsze
                               Przykłady    przerażające


Kowariancja i dolna granica typu


  Stos – użycie
  scala> :load examples/stack.scala
  Loading examples/stack.scala...
  defined class Stack

  scala> new Stack
  res0: Stack[Nothing] =

  scala> res0 push quot;Alaquot; push quot;maquot; push quot;kotaquot;
  res1: Stack[java.lang.String] = Ala ma kota

  scala> res1 pop
  res2: Stack[java.lang.String] =      Ala ma

  scala> res2 push 0
  res3: Stack[Any] =   Ala ma 0




                            Krzysztof Goj   BIWAK Scali
Wstęp     rozgrzewka
                                O języku    ciekawsze
                               Przykłady    przerażające


Kowariancja i dolna granica typu


  Stos – użycie
  scala> :load examples/stack.scala
  Loading examples/stack.scala...
  defined class Stack

  scala> new Stack
  res0: Stack[Nothing] =

  scala> res0 push quot;Alaquot; push quot;maquot; push quot;kotaquot;
  res1: Stack[java.lang.String] = Ala ma kota

  scala> res1 pop
  res2: Stack[java.lang.String] =      Ala ma

  scala> res2 push 0
  res3: Stack[Any] =   Ala ma 0




                            Krzysztof Goj   BIWAK Scali
Wstęp     rozgrzewka
                                O języku    ciekawsze
                               Przykłady    przerażające


Kowariancja i dolna granica typu


  Stos – użycie
  scala> :load examples/stack.scala
  Loading examples/stack.scala...
  defined class Stack

  scala> new Stack
  res0: Stack[Nothing] =

  scala> res0 push quot;Alaquot; push quot;maquot; push quot;kotaquot;
  res1: Stack[java.lang.String] = Ala ma kota

  scala> res1 pop
  res2: Stack[java.lang.String] =      Ala ma

  scala> res2 push 0
  res3: Stack[Any] =   Ala ma 0




                            Krzysztof Goj   BIWAK Scali
Wstęp     rozgrzewka
                                O języku    ciekawsze
                               Przykłady    przerażające


Kowariancja i dolna granica typu


  Stos – użycie
  scala> :load examples/stack.scala
  Loading examples/stack.scala...
  defined class Stack

  scala> new Stack
  res0: Stack[Nothing] =

  scala> res0 push quot;Alaquot; push quot;maquot; push quot;kotaquot;
  res1: Stack[java.lang.String] = Ala ma kota

  scala> res1 pop
  res2: Stack[java.lang.String] =      Ala ma

  scala> res2 push 0
  res3: Stack[Any] =   Ala ma 0




                            Krzysztof Goj   BIWAK Scali
Wstęp     rozgrzewka
                                O języku    ciekawsze
                               Przykłady    przerażające


Kowariancja i dolna granica typu


  Stos – użycie
  scala> :load examples/stack.scala
  Loading examples/stack.scala...
  defined class Stack

  scala> new Stack
  res0: Stack[Nothing] =

  scala> res0 push quot;Alaquot; push quot;maquot; push quot;kotaquot;
  res1: Stack[java.lang.String] = Ala ma kota

  scala> res1 pop
  res2: Stack[java.lang.String] =      Ala ma

  scala> res2 push 0
  res3: Stack[Any] =   Ala ma 0




                            Krzysztof Goj   BIWAK Scali
Wstęp     rozgrzewka
                                O języku    ciekawsze
                               Przykłady    przerażające


Kowariancja i dolna granica typu


  Stos – użycie
  scala> :load examples/stack.scala
  Loading examples/stack.scala...
  defined class Stack

  scala> new Stack
  res0: Stack[Nothing] =

  scala> res0 push quot;Alaquot; push quot;maquot; push quot;kotaquot;
  res1: Stack[java.lang.String] = Ala ma kota

  scala> res1 pop
  res2: Stack[java.lang.String] =      Ala ma

  scala> res2 push 0
  res3: Stack[Any] =   Ala ma 0




                            Krzysztof Goj   BIWAK Scali
Wstęp     rozgrzewka
                                O języku    ciekawsze
                               Przykłady    przerażające


Kowariancja i dolna granica typu


  Stos – użycie
  scala> :load examples/stack.scala
  Loading examples/stack.scala...
  defined class Stack

  scala> new Stack
  res0: Stack[Nothing] =

  scala> res0 push quot;Alaquot; push quot;maquot; push quot;kotaquot;
  res1: Stack[java.lang.String] = Ala ma kota

  scala> res1 pop
  res2: Stack[java.lang.String] =      Ala ma

  scala> res2 push 0
  res3: Stack[Any] =   Ala ma 0




                            Krzysztof Goj   BIWAK Scali
Wstęp     rozgrzewka
                                O języku    ciekawsze
                               Przykłady    przerażające


Kowariancja i dolna granica typu


  Stos – użycie
  scala> :load examples/stack.scala
  Loading examples/stack.scala...
  defined class Stack

  scala> new Stack
  res0: Stack[Nothing] =

  scala> res0 push quot;Alaquot; push quot;maquot; push quot;kotaquot;
  res1: Stack[java.lang.String] = Ala ma kota

  scala> res1 pop
  res2: Stack[java.lang.String] =      Ala ma

  scala> res2 push 0
  res3: Stack[Any] =   Ala ma 0




                            Krzysztof Goj   BIWAK Scali
Wstęp     rozgrzewka
                       O języku    ciekawsze
                      Przykłady    przerażające


Hierarchia typów




   stack.scala

                   Krzysztof Goj   BIWAK Scali
Wstęp     rozgrzewka
                   O języku    ciekawsze
                  Przykłady    przerażające


Funkcja




      trait Function1[-T1, +R]




               Krzysztof Goj   BIWAK Scali
Wstęp     rozgrzewka
                               O języku    ciekawsze
                              Przykłady    przerażające


Implicit Parameters

  Powtórka z algebry
  abstract class SemiGroup[A] {
    def add(x: A, y: A): A
  }
  abstract class Monoid[A] extends SemiGroup[A] {
    def unit: A
  }
  implicit object StringMonoid extends Monoid[String] {
    def add(x: String, y: String): String = x concat y
    def unit: String = quot;quot;
  }
  implicit object IntMonoid extends Monoid[int] {
    def add(x: Int, y: Int): Int = x + y
    def unit: Int = 0
  }
  def sum[A](xs: List[A])(implicit m: Monoid[A]): A = (m.unit /: xs)(m.add)

  println(sum(List(1, 2, 3)))
  println(sum(List(quot;aquot;, quot;bquot;, quot;cquot;)))


                           Krzysztof Goj   BIWAK Scali
Wstęp     rozgrzewka
                                 O języku    ciekawsze
                                Przykłady    przerażające


Parser Combinators

  Prosty Kalkulator
  import scala.util.parsing.combinator.lexical.StdLexical
  import scala.util.parsing.combinator.syntactical.StdTokenParsers

  object arithmeticParser extends StdTokenParsers {
    type Tokens = StdLexical ; val lexical = new StdLexical
    lexical.delimiters ++= List(quot;(quot;, quot;)quot;, quot;+quot;, quot;-quot;, quot;*quot;, quot;/quot;)

      lazy val expr =   term*(quot;+quot; ^^^ {(x: Int, y: Int) => x   +   y}
                            | quot;-quot; ^^^ {(x: Int, y: Int) => x   -   y})
      lazy val term = factor*(quot;*quot; ^^^ {(x: Int, y: Int) => x   *   y}
                            | quot;/quot; ^^^ {(x: Int, y: Int) => x   /   y})
      lazy val factor: Parser[Int] = quot;(quot; ~> expr <~ quot;)quot; |
                                     numericLit ^^ (_.toInt)

      def eval(str: String) = expr(new lexical.Scanner(str))
  }

  println(arithmeticParser.eval(quot;4 * (5+5) + 8/4quot;).get)


                             Krzysztof Goj   BIWAK Scali
Wstęp     rozgrzewka
                                 O języku    ciekawsze
                                Przykłady    przerażające


Parser Combinators

  Prosty Kalkulator
  import scala.util.parsing.combinator.lexical.StdLexical
  import scala.util.parsing.combinator.syntactical.StdTokenParsers

  object arithmeticParser extends StdTokenParsers {
    type Tokens = StdLexical ; val lexical = new StdLexical
    lexical.delimiters ++= List(quot;(quot;, quot;)quot;, quot;+quot;, quot;-quot;, quot;*quot;, quot;/quot;)

      lazy val expr =   term*(quot;+quot; ^^^ {(x: Int, y: Int) => x   +   y}
                            | quot;-quot; ^^^ {(x: Int, y: Int) => x   -   y})
      lazy val term = factor*(quot;*quot; ^^^ {(x: Int, y: Int) => x   *   y}
                            | quot;/quot; ^^^ {(x: Int, y: Int) => x   /   y})
      lazy val factor: Parser[Int] = quot;(quot; ~> expr <~ quot;)quot; |
                                     numericLit ^^ (_.toInt)

      def eval(str: String) = expr(new lexical.Scanner(str))
  }

  println(arithmeticParser.eval(quot;4 * (5+5) + 8/4quot;).get)


                             Krzysztof Goj   BIWAK Scali
Do poczytania
                       Zakończenie
                                      Dziękuję


Do poczytania



     http://www.scala-lang.org
     Blog Martina Oderskiego
     Blog Daniela Spiewaka
     Blog Jamesa Iry-ego
     http://scala-blogs.org/
     #scala na freenode
     Slajdy (z linkami) będą na
     http://biwak-agh.blogspot.com/




                      Krzysztof Goj   BIWAK Scali
Do poczytania
                       Zakończenie
                                      Dziękuję


Do poczytania



     http://www.scala-lang.org
     Blog Martina Oderskiego
     Blog Daniela Spiewaka
     Blog Jamesa Iry-ego
     http://scala-blogs.org/
     #scala na freenode
     Slajdy (z linkami) będą na
     http://biwak-agh.blogspot.com/




                      Krzysztof Goj   BIWAK Scali
Do poczytania
                       Zakończenie
                                      Dziękuję


Do poczytania



     http://www.scala-lang.org
     Blog Martina Oderskiego
     Blog Daniela Spiewaka
     Blog Jamesa Iry-ego
     http://scala-blogs.org/
     #scala na freenode
     Slajdy (z linkami) będą na
     http://biwak-agh.blogspot.com/




                      Krzysztof Goj   BIWAK Scali
Do poczytania
                       Zakończenie
                                      Dziękuję


Do poczytania



     http://www.scala-lang.org
     Blog Martina Oderskiego
     Blog Daniela Spiewaka
     Blog Jamesa Iry-ego
     http://scala-blogs.org/
     #scala na freenode
     Slajdy (z linkami) będą na
     http://biwak-agh.blogspot.com/




                      Krzysztof Goj   BIWAK Scali
Do poczytania
                       Zakończenie
                                      Dziękuję


Do poczytania



     http://www.scala-lang.org
     Blog Martina Oderskiego
     Blog Daniela Spiewaka
     Blog Jamesa Iry-ego
     http://scala-blogs.org/
     #scala na freenode
     Slajdy (z linkami) będą na
     http://biwak-agh.blogspot.com/




                      Krzysztof Goj   BIWAK Scali
Do poczytania
                       Zakończenie
                                      Dziękuję


Do poczytania



     http://www.scala-lang.org
     Blog Martina Oderskiego
     Blog Daniela Spiewaka
     Blog Jamesa Iry-ego
     http://scala-blogs.org/
     #scala na freenode
     Slajdy (z linkami) będą na
     http://biwak-agh.blogspot.com/




                      Krzysztof Goj   BIWAK Scali
Do poczytania
                       Zakończenie
                                      Dziękuję


Do poczytania



     http://www.scala-lang.org
     Blog Martina Oderskiego
     Blog Daniela Spiewaka
     Blog Jamesa Iry-ego
     http://scala-blogs.org/
     #scala na freenode
     Slajdy (z linkami) będą na
     http://biwak-agh.blogspot.com/




                      Krzysztof Goj   BIWAK Scali
Do poczytania
 Zakończenie
                Dziękuję




 Dobranoc!




Krzysztof Goj   BIWAK Scali

Contenu connexe

En vedette

2024 State of Marketing Report – by Hubspot
2024 State of Marketing Report – by Hubspot2024 State of Marketing Report – by Hubspot
2024 State of Marketing Report – by HubspotMarius Sescu
 
Everything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPTEverything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPTExpeed Software
 
Product Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage EngineeringsProduct Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage EngineeringsPixeldarts
 
How Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthHow Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthThinkNow
 
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfAI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfmarketingartwork
 
PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024Neil Kimberley
 
Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)contently
 
How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024Albert Qian
 
Social Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsSocial Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsKurio // The Social Media Age(ncy)
 
Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Search Engine Journal
 
5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summarySpeakerHub
 
ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd Clark Boyd
 
Getting into the tech field. what next
Getting into the tech field. what next Getting into the tech field. what next
Getting into the tech field. what next Tessa Mero
 
Google's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentGoogle's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentLily Ray
 
Time Management & Productivity - Best Practices
Time Management & Productivity -  Best PracticesTime Management & Productivity -  Best Practices
Time Management & Productivity - Best PracticesVit Horky
 
The six step guide to practical project management
The six step guide to practical project managementThe six step guide to practical project management
The six step guide to practical project managementMindGenius
 
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...RachelPearson36
 

En vedette (20)

2024 State of Marketing Report – by Hubspot
2024 State of Marketing Report – by Hubspot2024 State of Marketing Report – by Hubspot
2024 State of Marketing Report – by Hubspot
 
Everything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPTEverything You Need To Know About ChatGPT
Everything You Need To Know About ChatGPT
 
Product Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage EngineeringsProduct Design Trends in 2024 | Teenage Engineerings
Product Design Trends in 2024 | Teenage Engineerings
 
How Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental HealthHow Race, Age and Gender Shape Attitudes Towards Mental Health
How Race, Age and Gender Shape Attitudes Towards Mental Health
 
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdfAI Trends in Creative Operations 2024 by Artwork Flow.pdf
AI Trends in Creative Operations 2024 by Artwork Flow.pdf
 
Skeleton Culture Code
Skeleton Culture CodeSkeleton Culture Code
Skeleton Culture Code
 
PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024PEPSICO Presentation to CAGNY Conference Feb 2024
PEPSICO Presentation to CAGNY Conference Feb 2024
 
Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)Content Methodology: A Best Practices Report (Webinar)
Content Methodology: A Best Practices Report (Webinar)
 
How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024How to Prepare For a Successful Job Search for 2024
How to Prepare For a Successful Job Search for 2024
 
Social Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie InsightsSocial Media Marketing Trends 2024 // The Global Indie Insights
Social Media Marketing Trends 2024 // The Global Indie Insights
 
Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024Trends In Paid Search: Navigating The Digital Landscape In 2024
Trends In Paid Search: Navigating The Digital Landscape In 2024
 
5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary5 Public speaking tips from TED - Visualized summary
5 Public speaking tips from TED - Visualized summary
 
ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd ChatGPT and the Future of Work - Clark Boyd
ChatGPT and the Future of Work - Clark Boyd
 
Getting into the tech field. what next
Getting into the tech field. what next Getting into the tech field. what next
Getting into the tech field. what next
 
Google's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search IntentGoogle's Just Not That Into You: Understanding Core Updates & Search Intent
Google's Just Not That Into You: Understanding Core Updates & Search Intent
 
How to have difficult conversations
How to have difficult conversations How to have difficult conversations
How to have difficult conversations
 
Introduction to Data Science
Introduction to Data ScienceIntroduction to Data Science
Introduction to Data Science
 
Time Management & Productivity - Best Practices
Time Management & Productivity -  Best PracticesTime Management & Productivity -  Best Practices
Time Management & Productivity - Best Practices
 
The six step guide to practical project management
The six step guide to practical project managementThe six step guide to practical project management
The six step guide to practical project management
 
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
 

Scala

  • 1. Wstęp O języku Przykłady BIWAK Scali czyli Scala w domu i zagrodzie Krzysztof Goj Koło Naukowe Informatyków BIT 3 grudnia 2008 Krzysztof Goj BIWAK Scali
  • 2. Wstęp Czym jest Scala O języku Hello, World! Przykłady Czym jest Scala – flame Lepsza Java Haskell dla ludzi Ruby, który nie muli Procesy Erlanga na JVM Krzysztof Goj BIWAK Scali
  • 3. Wstęp Czym jest Scala O języku Hello, World! Przykłady Czym jest Scala – flame Lepsza Java Haskell dla ludzi Ruby, który nie muli Procesy Erlanga na JVM Krzysztof Goj BIWAK Scali
  • 4. Wstęp Czym jest Scala O języku Hello, World! Przykłady Czym jest Scala – flame Lepsza Java Haskell dla ludzi Ruby, który nie muli Procesy Erlanga na JVM Krzysztof Goj BIWAK Scali
  • 5. Wstęp Czym jest Scala O języku Hello, World! Przykłady Czym jest Scala – flame Lepsza Java Haskell dla ludzi Ruby, który nie muli Procesy Erlanga na JVM Krzysztof Goj BIWAK Scali
  • 6. Wstęp Czym jest Scala O języku Hello, World! Przykłady Czym jest Scala Nazwa i logo Obiektowo-funkcyjny język programowania wysokiego poziomu i ogólnego przeznaczenia. Zgodność z Javą, wersja na .NET Elastyczna składnia pozwala na tworzenie DSL-i Stworzona przez Martina Oderskiego (EPFL) http://www.scala-lang.org Krzysztof Goj BIWAK Scali
  • 7. Wstęp Czym jest Scala O języku Hello, World! Przykłady Czym jest Scala Nazwa i logo Obiektowo-funkcyjny język programowania wysokiego poziomu i ogólnego przeznaczenia. Zgodność z Javą, wersja na .NET Elastyczna składnia pozwala na tworzenie DSL-i Stworzona przez Martina Oderskiego (EPFL) http://www.scala-lang.org Krzysztof Goj BIWAK Scali
  • 8. Wstęp Czym jest Scala O języku Hello, World! Przykłady Czym jest Scala Nazwa i logo Obiektowo-funkcyjny język programowania wysokiego poziomu i ogólnego przeznaczenia. Zgodność z Javą, wersja na .NET Elastyczna składnia pozwala na tworzenie DSL-i Stworzona przez Martina Oderskiego (EPFL) http://www.scala-lang.org Krzysztof Goj BIWAK Scali
  • 9. Wstęp Czym jest Scala O języku Hello, World! Przykłady Czym jest Scala Nazwa i logo Obiektowo-funkcyjny język programowania wysokiego poziomu i ogólnego przeznaczenia. Zgodność z Javą, wersja na .NET Elastyczna składnia pozwala na tworzenie DSL-i Stworzona przez Martina Oderskiego (EPFL) http://www.scala-lang.org Krzysztof Goj BIWAK Scali
  • 10. Wstęp Czym jest Scala O języku Hello, World! Przykłady Czym jest Scala Nazwa i logo Obiektowo-funkcyjny język programowania wysokiego poziomu i ogólnego przeznaczenia. Zgodność z Javą, wersja na .NET Elastyczna składnia pozwala na tworzenie DSL-i Stworzona przez Martina Oderskiego (EPFL) http://www.scala-lang.org Krzysztof Goj BIWAK Scali
  • 11. Wstęp Czym jest Scala O języku Hello, World! Przykłady Czym jest Scala Nazwa i logo Obiektowo-funkcyjny język programowania wysokiego poziomu i ogólnego przeznaczenia. Zgodność z Javą, wersja na .NET Elastyczna składnia pozwala na tworzenie DSL-i Stworzona przez Martina Oderskiego (EPFL) http://www.scala-lang.org Krzysztof Goj BIWAK Scali
  • 12. Wstęp Czym jest Scala O języku Hello, World! Przykłady “Hello, World!” w shellu Najprościej Scalę zmusić do mówienia pisząc w shellu. shell goj@abulafia ∼ % scala Welcome to Scala version 2.7.1.final [...] Type in expressions to have them evaluated. Type :help for more information. scala> println(quot;Hello, World!quot;) Hello, World! Krzysztof Goj BIWAK Scali
  • 13. Wstęp Czym jest Scala O języku Hello, World! Przykłady “Hello, World!” w shellu Najprościej Scalę zmusić do mówienia pisząc w shellu. shell goj@abulafia ∼ % scala Welcome to Scala version 2.7.1.final [...] Type in expressions to have them evaluated. Type :help for more information. scala> println(quot;Hello, World!quot;) Hello, World! Krzysztof Goj BIWAK Scali
  • 14. Wstęp Czym jest Scala O języku Hello, World! Przykłady “Hello, World!” w shellu Najprościej Scalę zmusić do mówienia pisząc w shellu. shell goj@abulafia ∼ % scala Welcome to Scala version 2.7.1.final [...] Type in expressions to have them evaluated. Type :help for more information. scala> println(quot;Hello, World!quot;) Hello, World! Krzysztof Goj BIWAK Scali
  • 15. Wstęp Czym jest Scala O języku Hello, World! Przykłady “Hello, World!” w shellu Najprościej Scalę zmusić do mówienia pisząc w shellu. shell goj@abulafia ∼ % scala Welcome to Scala version 2.7.1.final [...] Type in expressions to have them evaluated. Type :help for more information. scala> println(quot;Hello, World!quot;) Hello, World! Krzysztof Goj BIWAK Scali
  • 16. Wstęp Czym jest Scala O języku Hello, World! Przykłady “Hello, World!” w shellu Najprościej Scalę zmusić do mówienia pisząc w shellu. shell goj@abulafia ∼ % scala Welcome to Scala version 2.7.1.final [...] Type in expressions to have them evaluated. Type :help for more information. scala> println(quot;Hello, World!quot;) Hello, World! Krzysztof Goj BIWAK Scali
  • 17. Wstęp Czym jest Scala O języku Hello, World! Przykłady “Hello, World!” w shellu Najprościej Scalę zmusić do mówienia pisząc w shellu. shell goj@abulafia ∼ % scala Welcome to Scala version 2.7.1.final [...] Type in expressions to have them evaluated. Type :help for more information. scala> println(quot;Hello, World!quot;) Hello, World! Krzysztof Goj BIWAK Scali
  • 18. Wstęp Czym jest Scala O języku Hello, World! Przykłady “Hello, World!” jako osobny program najczęściej pisze się tak. . . hello.scala object HelloWorld extends Application { println(quot;Hello, world!quot;) } shell goj@abulafia ∼ % scalac hello.scala goj@abulafia ∼ % ls Hello.class Hello$.class hello.scala goj@abulafia ∼ % scala -cp . Hello Hello, World! goj@abulafia ∼ % java -cp .:$SCALA_HOME/lib/scala-library.jar Hello Hello, World! Krzysztof Goj BIWAK Scali
  • 19. Wstęp Czym jest Scala O języku Hello, World! Przykłady “Hello, World!” jako osobny program najczęściej pisze się tak. . . hello.scala object HelloWorld extends Application { println(quot;Hello, world!quot;) } shell goj@abulafia ∼ % scalac hello.scala goj@abulafia ∼ % ls Hello.class Hello$.class hello.scala goj@abulafia ∼ % scala -cp . Hello Hello, World! goj@abulafia ∼ % java -cp .:$SCALA_HOME/lib/scala-library.jar Hello Hello, World! Krzysztof Goj BIWAK Scali
  • 20. Wstęp Czym jest Scala O języku Hello, World! Przykłady “Hello, World!” jako osobny program najczęściej pisze się tak. . . hello.scala object HelloWorld extends Application { println(quot;Hello, world!quot;) } shell goj@abulafia ∼ % scalac hello.scala goj@abulafia ∼ % ls Hello.class Hello$.class hello.scala goj@abulafia ∼ % scala -cp . Hello Hello, World! goj@abulafia ∼ % java -cp .:$SCALA_HOME/lib/scala-library.jar Hello Hello, World! Krzysztof Goj BIWAK Scali
  • 21. Wstęp Czym jest Scala O języku Hello, World! Przykłady “Hello, World!” jako osobny program najczęściej pisze się tak. . . hello.scala object HelloWorld extends Application { println(quot;Hello, world!quot;) } shell goj@abulafia ∼ % scalac hello.scala goj@abulafia ∼ % ls Hello.class Hello$.class hello.scala goj@abulafia ∼ % scala -cp . Hello Hello, World! goj@abulafia ∼ % java -cp .:$SCALA_HOME/lib/scala-library.jar Hello Hello, World! Krzysztof Goj BIWAK Scali
  • 22. Wstęp Czym jest Scala O języku Hello, World! Przykłady “Hello, World!” jako osobny program najczęściej pisze się tak. . . hello.scala object HelloWorld extends Application { println(quot;Hello, world!quot;) } shell goj@abulafia ∼ % scalac hello.scala goj@abulafia ∼ % ls Hello.class Hello$.class hello.scala goj@abulafia ∼ % scala -cp . Hello Hello, World! goj@abulafia ∼ % java -cp .:$SCALA_HOME/lib/scala-library.jar Hello Hello, World! Krzysztof Goj BIWAK Scali
  • 23. Wstęp Czym jest Scala O języku Hello, World! Przykłady “Hello, World!” jako osobny program najczęściej pisze się tak. . . hello.scala object HelloWorld extends Application { println(quot;Hello, world!quot;) } shell goj@abulafia ∼ % scalac hello.scala goj@abulafia ∼ % ls Hello.class Hello$.class hello.scala goj@abulafia ∼ % scala -cp . Hello Hello, World! goj@abulafia ∼ % java -cp .:$SCALA_HOME/lib/scala-library.jar Hello Hello, World! Krzysztof Goj BIWAK Scali
  • 24. Wstęp Czym jest Scala O języku Hello, World! Przykłady “Hello, World!” jako osobny program najczęściej pisze się tak. . . hello.scala object HelloWorld extends Application { println(quot;Hello, world!quot;) } shell goj@abulafia ∼ % scalac hello.scala goj@abulafia ∼ % ls Hello.class Hello$.class hello.scala goj@abulafia ∼ % scala -cp . Hello Hello, World! goj@abulafia ∼ % java -cp .:$SCALA_HOME/lib/scala-library.jar Hello Hello, World! Krzysztof Goj BIWAK Scali
  • 25. Wstęp Czym jest Scala O języku Hello, World! Przykłady “Hello, World!” jako osobny program najczęściej pisze się tak. . . hello.scala object HelloWorld extends Application { println(quot;Hello, world!quot;) } shell goj@abulafia ∼ % scalac hello.scala goj@abulafia ∼ % ls Hello.class Hello$.class hello.scala goj@abulafia ∼ % scala -cp . Hello Hello, World! goj@abulafia ∼ % java -cp .:$SCALA_HOME/lib/scala-library.jar Hello Hello, World! Krzysztof Goj BIWAK Scali
  • 26. Wstęp Czym jest Scala O języku Hello, World! Przykłady “Hello, World!” jako osobny program najczęściej pisze się tak. . . hello.scala object HelloWorld extends Application { println(quot;Hello, world!quot;) } shell goj@abulafia ∼ % scalac hello.scala goj@abulafia ∼ % ls Hello.class Hello$.class hello.scala goj@abulafia ∼ % scala -cp . Hello Hello, World! goj@abulafia ∼ % java -cp .:$SCALA_HOME/lib/scala-library.jar Hello Hello, World! Krzysztof Goj BIWAK Scali
  • 27. Wstęp Czym jest Scala O języku Hello, World! Przykłady “Hello, World!” jako osobny program najczęściej pisze się tak. . . hello.scala object HelloWorld extends Application { println(quot;Hello, world!quot;) } shell goj@abulafia ∼ % scalac hello.scala goj@abulafia ∼ % ls Hello.class Hello$.class hello.scala goj@abulafia ∼ % scala -cp . Hello Hello, World! goj@abulafia ∼ % java -cp .:$SCALA_HOME/lib/scala-library.jar Hello Hello, World! Krzysztof Goj BIWAK Scali
  • 28. Wstęp Czym jest Scala O języku Hello, World! Przykłady “Hello, World!” jako osobny program najczęściej pisze się tak. . . hello.scala object HelloWorld extends Application { println(quot;Hello, world!quot;) } shell goj@abulafia ∼ % scalac hello.scala goj@abulafia ∼ % ls Hello.class Hello$.class hello.scala goj@abulafia ∼ % scala -cp . Hello Hello, World! goj@abulafia ∼ % java -cp .:$SCALA_HOME/lib/scala-library.jar Hello Hello, World! Krzysztof Goj BIWAK Scali
  • 29. Wstęp Czym jest Scala O języku Hello, World! Przykłady “Hello, World!” jako skrypt . . . można też pisać skrypty script.sh #!/bin/sh exec scala quot;$0quot; quot;$¨ !# object HelloWorld { def main(args: Array[String]) { println(quot;Hello, World!quot;) } } HelloWorld.main(args) shell goj@abulafia ∼ % chmod +x script.sh goj@abulafia ∼ % ./script.sh Hello, World! Krzysztof Goj BIWAK Scali
  • 30. Wstęp Czym jest Scala O języku Hello, World! Przykłady “Hello, World!” jako skrypt . . . można też pisać skrypty script.sh #!/bin/sh exec scala quot;$0quot; quot;$¨ !# object HelloWorld { def main(args: Array[String]) { println(quot;Hello, World!quot;) } } HelloWorld.main(args) shell goj@abulafia ∼ % chmod +x script.sh goj@abulafia ∼ % ./script.sh Hello, World! Krzysztof Goj BIWAK Scali
  • 31. Wstęp Czym jest Scala O języku Hello, World! Przykłady “Hello, World!” jako skrypt . . . można też pisać skrypty script.sh #!/bin/sh exec scala quot;$0quot; quot;$¨ !# object HelloWorld { def main(args: Array[String]) { println(quot;Hello, World!quot;) } } HelloWorld.main(args) shell goj@abulafia ∼ % chmod +x script.sh goj@abulafia ∼ % ./script.sh Hello, World! Krzysztof Goj BIWAK Scali
  • 32. Wstęp Czym jest Scala O języku Hello, World! Przykłady “Hello, World!” jako skrypt . . . można też pisać skrypty script.sh #!/bin/sh exec scala quot;$0quot; quot;$¨ !# object HelloWorld { def main(args: Array[String]) { println(quot;Hello, World!quot;) } } HelloWorld.main(args) shell goj@abulafia ∼ % chmod +x script.sh goj@abulafia ∼ % ./script.sh Hello, World! Krzysztof Goj BIWAK Scali
  • 33. Wstęp Czym jest Scala O języku Hello, World! Przykłady “Hello, World!” jako skrypt . . . można też pisać skrypty script.sh #!/bin/sh exec scala quot;$0quot; quot;$¨ !# object HelloWorld { def main(args: Array[String]) { println(quot;Hello, World!quot;) } } HelloWorld.main(args) shell goj@abulafia ∼ % chmod +x script.sh goj@abulafia ∼ % ./script.sh Hello, World! Krzysztof Goj BIWAK Scali
  • 34. Wstęp Czym jest Scala O języku Hello, World! Przykłady “Hello, World!” jako skrypt . . . można też pisać skrypty script.sh #!/bin/sh exec scala quot;$0quot; quot;$¨ !# object HelloWorld { def main(args: Array[String]) { println(quot;Hello, World!quot;) } } HelloWorld.main(args) shell goj@abulafia ∼ % chmod +x script.sh goj@abulafia ∼ % ./script.sh Hello, World! Krzysztof Goj BIWAK Scali
  • 35. Wstęp Czym jest Scala O języku Hello, World! Przykłady “Hello, World!” jako skrypt . . . można też pisać skrypty script.sh #!/bin/sh exec scala quot;$0quot; quot;$¨ !# object HelloWorld { def main(args: Array[String]) { println(quot;Hello, World!quot;) } } HelloWorld.main(args) shell goj@abulafia ∼ % chmod +x script.sh goj@abulafia ∼ % ./script.sh Hello, World! Krzysztof Goj BIWAK Scali
  • 36. Wstęp Programowanie funkcyjne O języku Elastyczna Składnia Przykłady Inne Fundamenty programowania funkcyjnego Funkcje to zwykłe obiekty • Można je przekazywać jako argumenty do funkcji • Mogą być zwracane przez inne funkcje • Programujemy składając je na różne sposoby Izolowanie efektów ubocznych • Niezmienność (immutability) • Programujemy tworząc nowe obiekty na podstawie starych, a nie zmieniając istniejące Krzysztof Goj BIWAK Scali
  • 37. Wstęp Programowanie funkcyjne O języku Elastyczna Składnia Przykłady Inne Fundamenty programowania funkcyjnego Funkcje to zwykłe obiekty • Można je przekazywać jako argumenty do funkcji • Mogą być zwracane przez inne funkcje • Programujemy składając je na różne sposoby Izolowanie efektów ubocznych • Niezmienność (immutability) • Programujemy tworząc nowe obiekty na podstawie starych, a nie zmieniając istniejące Krzysztof Goj BIWAK Scali
  • 38. Wstęp Programowanie funkcyjne O języku Elastyczna Składnia Przykłady Inne Fundamenty programowania funkcyjnego Funkcje to zwykłe obiekty • Można je przekazywać jako argumenty do funkcji • Mogą być zwracane przez inne funkcje • Programujemy składając je na różne sposoby Izolowanie efektów ubocznych • Niezmienność (immutability) • Programujemy tworząc nowe obiekty na podstawie starych, a nie zmieniając istniejące Krzysztof Goj BIWAK Scali
  • 39. Wstęp Programowanie funkcyjne O języku Elastyczna Składnia Przykłady Inne Fundamenty programowania funkcyjnego Funkcje to zwykłe obiekty • Można je przekazywać jako argumenty do funkcji • Mogą być zwracane przez inne funkcje • Programujemy składając je na różne sposoby Izolowanie efektów ubocznych • Niezmienność (immutability) • Programujemy tworząc nowe obiekty na podstawie starych, a nie zmieniając istniejące Krzysztof Goj BIWAK Scali
  • 40. Wstęp Programowanie funkcyjne O języku Elastyczna Składnia Przykłady Inne Fundamenty programowania funkcyjnego Funkcje to zwykłe obiekty • Można je przekazywać jako argumenty do funkcji • Mogą być zwracane przez inne funkcje • Programujemy składając je na różne sposoby Izolowanie efektów ubocznych • Niezmienność (immutability) • Programujemy tworząc nowe obiekty na podstawie starych, a nie zmieniając istniejące Krzysztof Goj BIWAK Scali
  • 41. Wstęp Programowanie funkcyjne O języku Elastyczna Składnia Przykłady Inne Fundamenty programowania funkcyjnego Funkcje to zwykłe obiekty • Można je przekazywać jako argumenty do funkcji • Mogą być zwracane przez inne funkcje • Programujemy składając je na różne sposoby Izolowanie efektów ubocznych • Niezmienność (immutability) • Programujemy tworząc nowe obiekty na podstawie starych, a nie zmieniając istniejące Krzysztof Goj BIWAK Scali
  • 42. Wstęp Programowanie funkcyjne O języku Elastyczna Składnia Przykłady Inne Fundamenty programowania funkcyjnego Funkcje to zwykłe obiekty • Można je przekazywać jako argumenty do funkcji • Mogą być zwracane przez inne funkcje • Programujemy składając je na różne sposoby Izolowanie efektów ubocznych • Niezmienność (immutability) • Programujemy tworząc nowe obiekty na podstawie starych, a nie zmieniając istniejące Krzysztof Goj BIWAK Scali
  • 43. Wstęp Programowanie funkcyjne O języku Elastyczna Składnia Przykłady Inne Zalety programowania funkcyjnego Skalowalność Zwięzłość Naturalny sposób opisu wielu problemów Jest trędi–dżezi, kul, na topie Krzysztof Goj BIWAK Scali
  • 44. Wstęp Programowanie funkcyjne O języku Elastyczna Składnia Przykłady Inne Zalety programowania funkcyjnego Skalowalność Zwięzłość Naturalny sposób opisu wielu problemów Jest trędi–dżezi, kul, na topie Krzysztof Goj BIWAK Scali
  • 45. Wstęp Programowanie funkcyjne O języku Elastyczna Składnia Przykłady Inne Zalety programowania funkcyjnego Skalowalność Zwięzłość Naturalny sposób opisu wielu problemów Jest trędi–dżezi, kul, na topie Krzysztof Goj BIWAK Scali
  • 46. Wstęp Programowanie funkcyjne O języku Elastyczna Składnia Przykłady Inne Zalety programowania funkcyjnego Skalowalność Zwięzłość Naturalny sposób opisu wielu problemów Jest trędi–dżezi, kul, na topie Krzysztof Goj BIWAK Scali
  • 47. Wstęp Programowanie funkcyjne O języku Elastyczna Składnia Przykłady Inne Co to jest DSL? Domain Specific Languages Zewnętrzne (np. Make) Wewnętrzne (np. Rake) Krzysztof Goj BIWAK Scali
  • 48. Wstęp Programowanie funkcyjne O języku Elastyczna Składnia Przykłady Inne Co to jest DSL? Domain Specific Languages Zewnętrzne (np. Make) Wewnętrzne (np. Rake) Krzysztof Goj BIWAK Scali
  • 49. Wstęp Programowanie funkcyjne O języku Elastyczna Składnia Przykłady Inne Co to jest DSL? Domain Specific Languages Zewnętrzne (np. Make) Wewnętrzne (np. Rake) Krzysztof Goj BIWAK Scali
  • 50. Wstęp Programowanie funkcyjne O języku Elastyczna Składnia Przykłady Inne Co to jest DSL? Wewnętrzny DSL w Scali — Specs object helloWorld extends Specification { quot;’Hello, World!’ has 13 charactersquot; in { quot;Hello, World!quot;.size mustEqual 13 } quot;’Hello, World!’ matches /H.*W.*d.?/ regexpquot; in { quot;Hello, World!quot; must beMatching(quot;H.*W.*d.?quot;) } } Krzysztof Goj BIWAK Scali
  • 51. Wstęp Programowanie funkcyjne O języku Elastyczna Składnia Przykłady Inne Scala a współbieżność scala.actors scala.concurrent • scala.concurrent.pilib – rachunek π • scala.concurrent.jolib – join calculus • Lock, SyncChannel Scala-STM (poza biblioteką standardową) Krzysztof Goj BIWAK Scali
  • 52. Wstęp Programowanie funkcyjne O języku Elastyczna Składnia Przykłady Inne Scala a współbieżność scala.actors scala.concurrent • scala.concurrent.pilib – rachunek π • scala.concurrent.jolib – join calculus • Lock, SyncChannel Scala-STM (poza biblioteką standardową) Krzysztof Goj BIWAK Scali
  • 53. Wstęp Programowanie funkcyjne O języku Elastyczna Składnia Przykłady Inne Scala a współbieżność scala.actors scala.concurrent • scala.concurrent.pilib – rachunek π • scala.concurrent.jolib – join calculus • Lock, SyncChannel Scala-STM (poza biblioteką standardową) Krzysztof Goj BIWAK Scali
  • 54. Wstęp Programowanie funkcyjne O języku Elastyczna Składnia Przykłady Inne Scala a współbieżność scala.actors scala.concurrent • scala.concurrent.pilib – rachunek π • scala.concurrent.jolib – join calculus • Lock, SyncChannel Scala-STM (poza biblioteką standardową) Krzysztof Goj BIWAK Scali
  • 55. Wstęp Programowanie funkcyjne O języku Elastyczna Składnia Przykłady Inne Scala a współbieżność scala.actors scala.concurrent • scala.concurrent.pilib – rachunek π • scala.concurrent.jolib – join calculus • Lock, SyncChannel Scala-STM (poza biblioteką standardową) Krzysztof Goj BIWAK Scali
  • 56. Wstęp Programowanie funkcyjne O języku Elastyczna Składnia Przykłady Inne Scala a współbieżność scala.actors scala.concurrent • scala.concurrent.pilib – rachunek π • scala.concurrent.jolib – join calculus • Lock, SyncChannel Scala-STM (poza biblioteką standardową) Krzysztof Goj BIWAK Scali
  • 57. Wstęp Programowanie funkcyjne O języku Elastyczna Składnia Przykłady Inne traity pattern matching składnia dla XML-a inferencja typów domknięcia funkcyjne funkcje anonimowe implicit conversions implicit parameters for comprehensions i monady elastyczny system typów Krzysztof Goj BIWAK Scali
  • 58. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające Przykłady Krzysztof Goj BIWAK Scali
  • 59. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające Na rozgrzewkę - map Haskell map (1+) [1, 2, 3] Ruby [1, 2, 3].map {|i| i+1} Scheme (Lisp) (map (lambda (n) (1+ n)) ’(1 2 3)) Python [n+1 for n in [1, 2, 3]] Erlang lists:map(fun(N) -> N+1 end, [1, 2, 3]). Krzysztof Goj BIWAK Scali
  • 60. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające Na rozgrzewkę - map Java import java.util.List; import java.util.ArrayList; import static java.util.Arrays.asList; interface Function<Result, Arg> { public Result execute(Arg arg); } public class MapExample { public static<Result, Arg> List<Result> map(Function<Result, Arg> fn, Iterable<Arg> iter) { List<Result> result = new ArrayList<Result>(); for (Arg i: iter) result.add(fn.execute(i)); return result; } public static void main(String[] args) { map(new Function<Integer, Integer>() { public Integer execute(Integer i) { return i + 1; } }, asList(1, 2, 3)); } } Krzysztof Goj BIWAK Scali
  • 61. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające Na rozgrzewkę - map Scala object MapExample extends Application { def increase(n: Int): Int = { return n + 1; } Array(1, 2, 3).map(increase); } Scala — którka funkcja object MapExample extends Application { def increase(n: Int): Int = n + 1; Array(1, 2, 3).map(increase); } Scala — inferencja typów object MapExample extends Application { def increase(n: Int) = n + 1; Array(1, 2, 3).map(increase); } Krzysztof Goj BIWAK Scali
  • 62. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające Na rozgrzewkę - map Scala object MapExample extends Application { def increase(n: Int): Int = { return n + 1; } Array(1, 2, 3).map(increase); } Scala — którka funkcja object MapExample extends Application { def increase(n: Int): Int = n + 1; Array(1, 2, 3).map(increase); } Scala — inferencja typów object MapExample extends Application { def increase(n: Int) = n + 1; Array(1, 2, 3).map(increase); } Krzysztof Goj BIWAK Scali
  • 63. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające Na rozgrzewkę - map Scala object MapExample extends Application { def increase(n: Int): Int = { return n + 1; } Array(1, 2, 3).map(increase); } Scala — którka funkcja object MapExample extends Application { def increase(n: Int): Int = n + 1; Array(1, 2, 3).map(increase); } Scala — inferencja typów object MapExample extends Application { def increase(n: Int) = n + 1; Array(1, 2, 3).map(increase); } Krzysztof Goj BIWAK Scali
  • 64. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające Na rozgrzewkę - map to samo, co na poprzednim slajdzie def increase(n: Int) = n + 1; Array(1, 2, 3).map(increase); funkcja anonimowa Array(1, 2, 3).map((n: Int) => n + 1); dalsza inferencja typów Array(1, 2, 3).map(n => n + 1); anonimowy argument Array(1, 2, 3).map(_ + 1); wygodna składnia Array(1, 2, 3) map (_ + 1) Krzysztof Goj BIWAK Scali
  • 65. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające Na rozgrzewkę - map to samo, co na poprzednim slajdzie def increase(n: Int) = n + 1; Array(1, 2, 3).map(increase); funkcja anonimowa Array(1, 2, 3).map((n: Int) => n + 1); dalsza inferencja typów Array(1, 2, 3).map(n => n + 1); anonimowy argument Array(1, 2, 3).map(_ + 1); wygodna składnia Array(1, 2, 3) map (_ + 1) Krzysztof Goj BIWAK Scali
  • 66. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające Na rozgrzewkę - map to samo, co na poprzednim slajdzie def increase(n: Int) = n + 1; Array(1, 2, 3).map(increase); funkcja anonimowa Array(1, 2, 3).map((n: Int) => n + 1); dalsza inferencja typów Array(1, 2, 3).map(n => n + 1); anonimowy argument Array(1, 2, 3).map(_ + 1); wygodna składnia Array(1, 2, 3) map (_ + 1) Krzysztof Goj BIWAK Scali
  • 67. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające Na rozgrzewkę - map to samo, co na poprzednim slajdzie def increase(n: Int) = n + 1; Array(1, 2, 3).map(increase); funkcja anonimowa Array(1, 2, 3).map((n: Int) => n + 1); dalsza inferencja typów Array(1, 2, 3).map(n => n + 1); anonimowy argument Array(1, 2, 3).map(_ + 1); wygodna składnia Array(1, 2, 3) map (_ + 1) Krzysztof Goj BIWAK Scali
  • 68. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające Na rozgrzewkę - map to samo, co na poprzednim slajdzie def increase(n: Int) = n + 1; Array(1, 2, 3).map(increase); funkcja anonimowa Array(1, 2, 3).map((n: Int) => n + 1); dalsza inferencja typów Array(1, 2, 3).map(n => n + 1); anonimowy argument Array(1, 2, 3).map(_ + 1); wygodna składnia Array(1, 2, 3) map (_ + 1) Krzysztof Goj BIWAK Scali
  • 69. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające takaSkładnia.setJestBrzydka(true) Settery i gettery class DateError extends Exception class TimeOfDayVar { private var h, m, s: Int = 0 def hours = h def hours_= (h: Int) = if (0 <= h && h < 24) this.h = h else throw new DateError() // ... } def main(args: Array[String]) { val d = new TimeOfDayVar d.hours = 8; d.minutes = 30; d.seconds = 0 d.hours = 25 // throws a DateError exception } Krzysztof Goj BIWAK Scali
  • 70. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające Implicit Conversions silnia def fact(n: Int): BigInt = if (n > 0) BigInt(n) * fact(n-1) else 1 implicit def enrich(n: Int) = new { def !(): BigInt = fact(n) } println(42!) 1405006117752879898543142606244511569936384000000000 Krzysztof Goj BIWAK Scali
  • 71. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające Implicit Conversions silnia def fact(n: Int): BigInt = if (n > 0) BigInt(n) * fact(n-1) else 1 implicit def enrich(n: Int) = new { def !(): BigInt = fact(n) } println(42!) 1405006117752879898543142606244511569936384000000000 Krzysztof Goj BIWAK Scali
  • 72. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające For Comprehensions sprytne pętle for (i <- 1 to 100 by 7) println(i) for (i <- 1 to 100 by 7 if i % 3 == 0) println(i) val numbers = for (i <- 1 to 100 by 7 if i % 3 == 0) yield i-1 odcukrzamy (1).to(100).by(7).foreach(println) (1).to(100).by(7).filter(_ % 3 == 0).foreach(println) val numbers = (1).to(100).by(7).filter(_ % 3 == 0).map(_-1) Krzysztof Goj BIWAK Scali
  • 73. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające For Comprehensions sprytne pętle for (i <- 1 to 100 by 7) println(i) for (i <- 1 to 100 by 7 if i % 3 == 0) println(i) val numbers = for (i <- 1 to 100 by 7 if i % 3 == 0) yield i-1 odcukrzamy (1).to(100).by(7).foreach(println) (1).to(100).by(7).filter(_ % 3 == 0).foreach(println) val numbers = (1).to(100).by(7).filter(_ % 3 == 0).map(_-1) Krzysztof Goj BIWAK Scali
  • 74. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające For Comprehensions sprytne pętle for (i <- 1 to 100 by 7) println(i) for (i <- 1 to 100 by 7 if i % 3 == 0) println(i) val numbers = for (i <- 1 to 100 by 7 if i % 3 == 0) yield i-1 odcukrzamy (1).to(100).by(7).foreach(println) (1).to(100).by(7).filter(_ % 3 == 0).foreach(println) val numbers = (1).to(100).by(7).filter(_ % 3 == 0).map(_-1) Krzysztof Goj BIWAK Scali
  • 75. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające For Comprehensions sprytne pętle for (i <- 1 to 100 by 7) println(i) for (i <- 1 to 100 by 7 if i % 3 == 0) println(i) val numbers = for (i <- 1 to 100 by 7 if i % 3 == 0) yield i-1 odcukrzamy (1).to(100).by(7).foreach(println) (1).to(100).by(7).filter(_ % 3 == 0).foreach(println) val numbers = (1).to(100).by(7).filter(_ % 3 == 0).map(_-1) Krzysztof Goj BIWAK Scali
  • 76. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające Opcje Opcje import scala.collection.mutable.HashMap val numbers = HashMap(0 -> quot;nicquot;, 1 -> quot;jednoquot;, 2 -> quot;dwaquot;) val rnd = new Random numbers get rnd.nextInt(7) match { case Some(name) => println(quot;To quot; + name) case None => println(quot;Dużoquot;) } println(numbers get rnd.nextInt(7) map {_.capitalize + quot;!quot;} getOrElse quot;DUŻO!!!quot;) Krzysztof Goj BIWAK Scali
  • 77. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające ScalaCheck — QuickCheck i więcej ScalaCheck import org.scalacheck._ object StringSpecification extends Properties(quot;Stringquot;) { specify(quot;startsWithquot;, (a: String, b: String) => (a+b).startsWith(a)) specify(quot;endsWithquot;, (a: String, b: String) => (a+b).endsWith(b)) // Is this really always true? specify(quot;concatquot;, (a: String, b: String) => (a+b).length > a.length && (a+b).length > b.length ) specify(quot;substringquot;, (a: String, b: String) => (a+b).substring(a.length) == b ) specify(quot;substringquot;, (a: String, b: String, c: String) => (a+b+c).substring(a.length, a.length+b.length) == b ) } Krzysztof Goj BIWAK Scali
  • 78. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające Traity Trait ordered trait Ordered[A] { def compare(that: A): Int def < (that: A): Boolean = (this compare that) < 0 def > (that: A): Boolean = (this compare that) > 0 def <= (that: A): Boolean = (this compare that) <= 0 def >= (that: A): Boolean = (this compare that) >= 0 def compareTo(that: A): Int = compare(that) } Użycie class Sth(val a: Int) extends Ordered[Sth] { override def compare(other: Sth) = { val b = other.a (a*a) compare (b*b) } } val rnd = new Random println(if (new Sth(-3) < new Sth(rnd nextInt 5)) quot;Yesquot; else quot;Noquot;) Krzysztof Goj BIWAK Scali
  • 79. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające Traity Trait ordered trait Ordered[A] { def compare(that: A): Int def < (that: A): Boolean = (this compare that) < 0 def > (that: A): Boolean = (this compare that) > 0 def <= (that: A): Boolean = (this compare that) <= 0 def >= (that: A): Boolean = (this compare that) >= 0 def compareTo(that: A): Int = compare(that) } Użycie class Sth(val a: Int) extends Ordered[Sth] { override def compare(other: Sth) = { val b = other.a (a*a) compare (b*b) } } val rnd = new Random println(if (new Sth(-3) < new Sth(rnd nextInt 5)) quot;Yesquot; else quot;Noquot;) Krzysztof Goj BIWAK Scali
  • 80. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające Domknięcia Zapis var counter = 0 def bump_up() { counter += 1 } Odczyt def outer(a: Int): Int = { def helper(b: Int) = a * a - b helper(4) + helper(a-1) } Krzysztof Goj BIWAK Scali
  • 81. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające Domknięcia Zapis var counter = 0 def bump_up() { counter += 1 } Odczyt def outer(a: Int): Int = { def helper(b: Int) = a * a - b helper(4) + helper(a-1) } Krzysztof Goj BIWAK Scali
  • 82. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające Domknięcia Licznik — patologicznik def mkCounter() = { var soFar = 0 def counter(n: Int) = { soFar += n soFar } counter _ } val cnt1 = mkCounter() val cnt2 = mkCounter() cnt1(1); cnt1(30) println(cnt1(11)) println(cnt2(7)) wypisze 42 i 7 Krzysztof Goj BIWAK Scali
  • 83. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające XML – tworzenie XML case class Person(name: String, age: Int) class AddressBook(a: Person*) { private val people: List[Person] = a.toList def toXHTML = <table class=quot;XMLquot;> <tr> <th>Last Name</th> <th>First Name</th> </tr> { for (val p <- people) yield <tr> <td>{ p.name }</td> <td>{ p.age.toString }</td> </tr> } </table>; } Krzysztof Goj BIWAK Scali
  • 84. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające XML – wyszukiwanie 1/3 XML def understandFakt(note: scala.xml.Node): String = note match { case <murder> <criminal> <name>{murdererName}</name> <age>{murderAge}</age> </criminal> <victim><name>{victimName}</name>{_*}</victim> </murder> => quot;ZBRODNIA! quot; + murderAge + quot;-letni quot; + murderAge + quot; zabił quot; + quot; quot; + victimName case <advert>{content}</advert> => quot;Kupuj quot; + content case _ => quot;prognoza pogody: będzie padaćquot; } Krzysztof Goj BIWAK Scali
  • 85. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające XML – wyszukiwanie 2/3 XML val stuff = <badStuff> <newspapers> <newspaper title=quot;Nasz Dziennikquot;>...</newspaper> <newspaper title=quot;NIEquot;>...</newspaper> <newspaper title=quot;Faktquot;> <frontPage> <advert>Fakt</advert> <pogoda/> </frontPage> </newspaper> </newspapers> </badStuff> Krzysztof Goj BIWAK Scali
  • 86. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające XML – wyszukiwanie 3/3 XML for { val paper <- stuff quot;newspapersquot; quot;newspaperquot; paper.attributes(quot;titlequot;) == quot;Faktquot; val frontPage <- paper quot;frontPagequot; val article <- frontPage child } println(understandFakt(article)) Krzysztof Goj BIWAK Scali
  • 87. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające Kowariancja i dolna granica typu Stos – definicja class Stack[+A] { def push[B >: A](elem: B): Stack[B] = new Stack[B] { override def top: B = elem override def pop: Stack[B] = Stack.this override def toString() = Stack.this.toString() + quot; quot; + elem.toString() } def top: A = error(quot;no element on stackquot;) def pop: Stack[A] = error(quot;no element on stackquot;) override def toString() = quot;quot; } hierarchia klas Krzysztof Goj BIWAK Scali
  • 88. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające Kowariancja i dolna granica typu Stos – użycie scala> :load examples/stack.scala Loading examples/stack.scala... defined class Stack scala> new Stack res0: Stack[Nothing] = scala> res0 push quot;Alaquot; push quot;maquot; push quot;kotaquot; res1: Stack[java.lang.String] = Ala ma kota scala> res1 pop res2: Stack[java.lang.String] = Ala ma scala> res2 push 0 res3: Stack[Any] = Ala ma 0 Krzysztof Goj BIWAK Scali
  • 89. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające Kowariancja i dolna granica typu Stos – użycie scala> :load examples/stack.scala Loading examples/stack.scala... defined class Stack scala> new Stack res0: Stack[Nothing] = scala> res0 push quot;Alaquot; push quot;maquot; push quot;kotaquot; res1: Stack[java.lang.String] = Ala ma kota scala> res1 pop res2: Stack[java.lang.String] = Ala ma scala> res2 push 0 res3: Stack[Any] = Ala ma 0 Krzysztof Goj BIWAK Scali
  • 90. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające Kowariancja i dolna granica typu Stos – użycie scala> :load examples/stack.scala Loading examples/stack.scala... defined class Stack scala> new Stack res0: Stack[Nothing] = scala> res0 push quot;Alaquot; push quot;maquot; push quot;kotaquot; res1: Stack[java.lang.String] = Ala ma kota scala> res1 pop res2: Stack[java.lang.String] = Ala ma scala> res2 push 0 res3: Stack[Any] = Ala ma 0 Krzysztof Goj BIWAK Scali
  • 91. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające Kowariancja i dolna granica typu Stos – użycie scala> :load examples/stack.scala Loading examples/stack.scala... defined class Stack scala> new Stack res0: Stack[Nothing] = scala> res0 push quot;Alaquot; push quot;maquot; push quot;kotaquot; res1: Stack[java.lang.String] = Ala ma kota scala> res1 pop res2: Stack[java.lang.String] = Ala ma scala> res2 push 0 res3: Stack[Any] = Ala ma 0 Krzysztof Goj BIWAK Scali
  • 92. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające Kowariancja i dolna granica typu Stos – użycie scala> :load examples/stack.scala Loading examples/stack.scala... defined class Stack scala> new Stack res0: Stack[Nothing] = scala> res0 push quot;Alaquot; push quot;maquot; push quot;kotaquot; res1: Stack[java.lang.String] = Ala ma kota scala> res1 pop res2: Stack[java.lang.String] = Ala ma scala> res2 push 0 res3: Stack[Any] = Ala ma 0 Krzysztof Goj BIWAK Scali
  • 93. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające Kowariancja i dolna granica typu Stos – użycie scala> :load examples/stack.scala Loading examples/stack.scala... defined class Stack scala> new Stack res0: Stack[Nothing] = scala> res0 push quot;Alaquot; push quot;maquot; push quot;kotaquot; res1: Stack[java.lang.String] = Ala ma kota scala> res1 pop res2: Stack[java.lang.String] = Ala ma scala> res2 push 0 res3: Stack[Any] = Ala ma 0 Krzysztof Goj BIWAK Scali
  • 94. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające Kowariancja i dolna granica typu Stos – użycie scala> :load examples/stack.scala Loading examples/stack.scala... defined class Stack scala> new Stack res0: Stack[Nothing] = scala> res0 push quot;Alaquot; push quot;maquot; push quot;kotaquot; res1: Stack[java.lang.String] = Ala ma kota scala> res1 pop res2: Stack[java.lang.String] = Ala ma scala> res2 push 0 res3: Stack[Any] = Ala ma 0 Krzysztof Goj BIWAK Scali
  • 95. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające Kowariancja i dolna granica typu Stos – użycie scala> :load examples/stack.scala Loading examples/stack.scala... defined class Stack scala> new Stack res0: Stack[Nothing] = scala> res0 push quot;Alaquot; push quot;maquot; push quot;kotaquot; res1: Stack[java.lang.String] = Ala ma kota scala> res1 pop res2: Stack[java.lang.String] = Ala ma scala> res2 push 0 res3: Stack[Any] = Ala ma 0 Krzysztof Goj BIWAK Scali
  • 96. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające Kowariancja i dolna granica typu Stos – użycie scala> :load examples/stack.scala Loading examples/stack.scala... defined class Stack scala> new Stack res0: Stack[Nothing] = scala> res0 push quot;Alaquot; push quot;maquot; push quot;kotaquot; res1: Stack[java.lang.String] = Ala ma kota scala> res1 pop res2: Stack[java.lang.String] = Ala ma scala> res2 push 0 res3: Stack[Any] = Ala ma 0 Krzysztof Goj BIWAK Scali
  • 97. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające Kowariancja i dolna granica typu Stos – użycie scala> :load examples/stack.scala Loading examples/stack.scala... defined class Stack scala> new Stack res0: Stack[Nothing] = scala> res0 push quot;Alaquot; push quot;maquot; push quot;kotaquot; res1: Stack[java.lang.String] = Ala ma kota scala> res1 pop res2: Stack[java.lang.String] = Ala ma scala> res2 push 0 res3: Stack[Any] = Ala ma 0 Krzysztof Goj BIWAK Scali
  • 98. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające Kowariancja i dolna granica typu Stos – użycie scala> :load examples/stack.scala Loading examples/stack.scala... defined class Stack scala> new Stack res0: Stack[Nothing] = scala> res0 push quot;Alaquot; push quot;maquot; push quot;kotaquot; res1: Stack[java.lang.String] = Ala ma kota scala> res1 pop res2: Stack[java.lang.String] = Ala ma scala> res2 push 0 res3: Stack[Any] = Ala ma 0 Krzysztof Goj BIWAK Scali
  • 99. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające Hierarchia typów stack.scala Krzysztof Goj BIWAK Scali
  • 100. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające Funkcja trait Function1[-T1, +R] Krzysztof Goj BIWAK Scali
  • 101. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające Implicit Parameters Powtórka z algebry abstract class SemiGroup[A] { def add(x: A, y: A): A } abstract class Monoid[A] extends SemiGroup[A] { def unit: A } implicit object StringMonoid extends Monoid[String] { def add(x: String, y: String): String = x concat y def unit: String = quot;quot; } implicit object IntMonoid extends Monoid[int] { def add(x: Int, y: Int): Int = x + y def unit: Int = 0 } def sum[A](xs: List[A])(implicit m: Monoid[A]): A = (m.unit /: xs)(m.add) println(sum(List(1, 2, 3))) println(sum(List(quot;aquot;, quot;bquot;, quot;cquot;))) Krzysztof Goj BIWAK Scali
  • 102. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające Parser Combinators Prosty Kalkulator import scala.util.parsing.combinator.lexical.StdLexical import scala.util.parsing.combinator.syntactical.StdTokenParsers object arithmeticParser extends StdTokenParsers { type Tokens = StdLexical ; val lexical = new StdLexical lexical.delimiters ++= List(quot;(quot;, quot;)quot;, quot;+quot;, quot;-quot;, quot;*quot;, quot;/quot;) lazy val expr = term*(quot;+quot; ^^^ {(x: Int, y: Int) => x + y} | quot;-quot; ^^^ {(x: Int, y: Int) => x - y}) lazy val term = factor*(quot;*quot; ^^^ {(x: Int, y: Int) => x * y} | quot;/quot; ^^^ {(x: Int, y: Int) => x / y}) lazy val factor: Parser[Int] = quot;(quot; ~> expr <~ quot;)quot; | numericLit ^^ (_.toInt) def eval(str: String) = expr(new lexical.Scanner(str)) } println(arithmeticParser.eval(quot;4 * (5+5) + 8/4quot;).get) Krzysztof Goj BIWAK Scali
  • 103. Wstęp rozgrzewka O języku ciekawsze Przykłady przerażające Parser Combinators Prosty Kalkulator import scala.util.parsing.combinator.lexical.StdLexical import scala.util.parsing.combinator.syntactical.StdTokenParsers object arithmeticParser extends StdTokenParsers { type Tokens = StdLexical ; val lexical = new StdLexical lexical.delimiters ++= List(quot;(quot;, quot;)quot;, quot;+quot;, quot;-quot;, quot;*quot;, quot;/quot;) lazy val expr = term*(quot;+quot; ^^^ {(x: Int, y: Int) => x + y} | quot;-quot; ^^^ {(x: Int, y: Int) => x - y}) lazy val term = factor*(quot;*quot; ^^^ {(x: Int, y: Int) => x * y} | quot;/quot; ^^^ {(x: Int, y: Int) => x / y}) lazy val factor: Parser[Int] = quot;(quot; ~> expr <~ quot;)quot; | numericLit ^^ (_.toInt) def eval(str: String) = expr(new lexical.Scanner(str)) } println(arithmeticParser.eval(quot;4 * (5+5) + 8/4quot;).get) Krzysztof Goj BIWAK Scali
  • 104. Do poczytania Zakończenie Dziękuję Do poczytania http://www.scala-lang.org Blog Martina Oderskiego Blog Daniela Spiewaka Blog Jamesa Iry-ego http://scala-blogs.org/ #scala na freenode Slajdy (z linkami) będą na http://biwak-agh.blogspot.com/ Krzysztof Goj BIWAK Scali
  • 105. Do poczytania Zakończenie Dziękuję Do poczytania http://www.scala-lang.org Blog Martina Oderskiego Blog Daniela Spiewaka Blog Jamesa Iry-ego http://scala-blogs.org/ #scala na freenode Slajdy (z linkami) będą na http://biwak-agh.blogspot.com/ Krzysztof Goj BIWAK Scali
  • 106. Do poczytania Zakończenie Dziękuję Do poczytania http://www.scala-lang.org Blog Martina Oderskiego Blog Daniela Spiewaka Blog Jamesa Iry-ego http://scala-blogs.org/ #scala na freenode Slajdy (z linkami) będą na http://biwak-agh.blogspot.com/ Krzysztof Goj BIWAK Scali
  • 107. Do poczytania Zakończenie Dziękuję Do poczytania http://www.scala-lang.org Blog Martina Oderskiego Blog Daniela Spiewaka Blog Jamesa Iry-ego http://scala-blogs.org/ #scala na freenode Slajdy (z linkami) będą na http://biwak-agh.blogspot.com/ Krzysztof Goj BIWAK Scali
  • 108. Do poczytania Zakończenie Dziękuję Do poczytania http://www.scala-lang.org Blog Martina Oderskiego Blog Daniela Spiewaka Blog Jamesa Iry-ego http://scala-blogs.org/ #scala na freenode Slajdy (z linkami) będą na http://biwak-agh.blogspot.com/ Krzysztof Goj BIWAK Scali
  • 109. Do poczytania Zakończenie Dziękuję Do poczytania http://www.scala-lang.org Blog Martina Oderskiego Blog Daniela Spiewaka Blog Jamesa Iry-ego http://scala-blogs.org/ #scala na freenode Slajdy (z linkami) będą na http://biwak-agh.blogspot.com/ Krzysztof Goj BIWAK Scali
  • 110. Do poczytania Zakończenie Dziękuję Do poczytania http://www.scala-lang.org Blog Martina Oderskiego Blog Daniela Spiewaka Blog Jamesa Iry-ego http://scala-blogs.org/ #scala na freenode Slajdy (z linkami) będą na http://biwak-agh.blogspot.com/ Krzysztof Goj BIWAK Scali
  • 111. Do poczytania Zakończenie Dziękuję Dobranoc! Krzysztof Goj BIWAK Scali