S CALA: ein kurzer Überblick                             JUGHRO-Treffen November 2011                             Roland E...
Disclaimer•   Ich bin ein S CALA-Anfänger•   Übergang schrittweise &    punktuell•   No Silver Bullet                     ...
ÜberblickWarum Scala?Snippets & GrundkonzepteBeispiel: Rationale ZahlenPraxisZusammenfassung16. November 2011   c 2011   U...
Warum   •     Interessante Sprache :-)   •     Nutzt Java als Plattform (JVM)   •     ’Kritische Masse’ scheint erreicht (...
Motivation   •     Scala = Scalable Language   •     Soll mit Nutzeranforderungen wachsen   •     Skript ⇐⇒ Große Anwendun...
Material•   Gutes Buch vom Entwickler der Sprache    (Martin Odersky)•   Erste Auflage frei verfügbar:    http://www.artima...
Funktionale Programmierung1   1. Funktionen sind Objekte erster Klasse   2. Funktionen haben keine Seiteneffekteval meineF...
Maps, Operatoren & das Factory-Pattern   var capital = Map("US" -> "Washington", "France" -> "Paris")   capital += ("Japan...
Interoperabilität mit Java / Neue Typen erzeugen{    import java.math.BigInteger    def factorial(x: BigInteger): BigInteg...
Neue Kontrollstrukturen erzeugen2   actor {     var sum = 0     loop {       receive {         case Data(bytes)     => sum...
Weniger Boilerplate (durch ’Properties’)   class MyClass {       private int index;       private String name;           p...
Weniger Boilerplate (durch funktionaleProgrammierung)   boolean nameHasUpperCase = false;   for (int i = 0; i < name.lengt...
Weniger Boilerplate (durch Support für n-Tupel)3//In James II wäre das:import james.core.util.misc.Pair;//...Pair<Integer,...
GrundideenFunktionen...   •     geben immer etwas zurück (zumindest Unit)   •     können teilweise definiert werden (⇒ Curr...
Aufruf von Funktionenclass MeineKlasse {  def verdoppeln(x: Int) = 2 * x  def <<(x: Int) = verdoppeln(x)}val meinObjekt = ...
Aufruf von Funktionendef main(args: Array[String]) {args.foreach((arg: String) => println(arg))args.foreach(arg => println...
Grundideen   •     Mehrere public Klassen pro Datei erlaubt.   •     Keine primitiven Datentypen mehr (1.toString ist OK) ...
Was ist (fast) gleich?   •     Grundlegende Organisation des Codes (Pakete + Klassen)   •     Kontrollstrukturen wie for, ...
Jetzt mal ein konkretes Beispiel...16. November 2011   c 2011   UNIVERSITÄT ROSTOCK | FAKULTÄT FÜR INFORMATIK UND ELEKTROT...
Rationale Zahlen                     nSind Zahlen der Form d mit n ∈ Z, d ∈ N ("‘Brüche"’)...bauen wir also eine Klasse:  ...
Hinzufügen der Addition5       class Rational(n: Int, d: Int) {         require(d != 0)         val numer: Int = n        ...
Hilfskonstruktor für                         n                                             1       class Rational(n: Int, ...
GGT zur Vereinfachung des Bruchs       class Rational(n:                      Int, d: Int) {         private val g =      ...
’Operatoren’       class Rational(n: Int, d: Int) {         //...         def + (that: Rational): Rational =           new...
Unäre ’Operatoren’ und Backticksclass Rational(n: Int, d: Int) {  //...  def unary_~() = new Rational(denom, num)    def u...
’Operatoren’ für andere Typen       class Rational(n: Int, d: Int) {         //...           def + (i: Int): Rational =   ...
Implizite Typumwandlungclass Rational(n: Int, d: Int)//...object TestRationals {  implicit def intToRational(x: Int) = new...
Vorsicht!                                                       "‘[...]creating methods with operator names and           ...
’Pimp-My-Library’ Patternimport java.io._import scala.io._class RichFile(file: File ) {    def text = Source.fromFile( fil...
Praxis16. November 2011   c 2011   UNIVERSITÄT ROSTOCK | FAKULTÄT FÜR INFORMATIK UND ELEKTROTECHNIK   30
Tools   •     Eclipse-Integration: http://www.scala-ide.org   •     Test-Frameworks: JUnit etc. (Bytecode-kompatibel)   • ...
Maven-Integration6  <!-- ... -->        <dependency>            <groupId>org.scala-lang</groupId>            <artifactId>s...
Scripting#!/bin/shexec scala "$0" "$@"!#import java.io._import scala.collection.mutable.Setif(args.size < 2) {println("Usa...
Zusammenfassung16. November 2011   c 2011   UNIVERSITÄT ROSTOCK | FAKULTÄT FÜR INFORMATIK UND ELEKTROTECHNIK   34
Zusammenfassung   •     Scala ist JVM-kompatibel   •     Scala ’wächst’ mit den Aufgaben   •     Scala ist ideal, um als J...
Interessante Features die es nicht in den Überblickgeschafft haben   •     Actors (einfache nebenläufige Programmierung)   ...
AlternativenJava ohne Boilerplate: http://www.eclipse.org/Xtext/xtend’Echte’ funktionale Programmierung auf der JVM: http:...
Material zum Weitermachen   •     The busy Java developer’s guide to Scala:         http://www.ibm.com/developerworks/java...
Lizenzen   •     Bilder von Folie #2 & #28: Creative Commons BY-NC-SA 2.0   •     Alle eigenen Inhalte ebenso  Siehe: http...
Upcoming SlideShare
Loading in …5
×

SCALA: ein kurzer Überblick

610 views

Published on

Vortrag bei der Java User Group Rostock (16. 11. 2011)

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

  • Be the first to like this

No Downloads
Views
Total views
610
On SlideShare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
4
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

SCALA: ein kurzer Überblick

  1. 1. S CALA: ein kurzer Überblick JUGHRO-Treffen November 2011 Roland Ewald Institut für Informatik, Universität Rostock16. November 2011 c 2011 UNIVERSITÄT ROSTOCK | FAKULTÄT FÜR INFORMATIK UND ELEKTROTECHNIK 1
  2. 2. Disclaimer• Ich bin ein S CALA-Anfänger• Übergang schrittweise & punktuell• No Silver Bullet Image source: user whatnot, http://www.flickr.com/photos/whatnot/6853556/ 16. November 2011 c 2011 UNIVERSITÄT ROSTOCK | FAKULTÄT FÜR INFORMATIK UND ELEKTROTECHNIK 2
  3. 3. ÜberblickWarum Scala?Snippets & GrundkonzepteBeispiel: Rationale ZahlenPraxisZusammenfassung16. November 2011 c 2011 UNIVERSITÄT ROSTOCK | FAKULTÄT FÜR INFORMATIK UND ELEKTROTECHNIK 3
  4. 4. Warum • Interessante Sprache :-) • Nutzt Java als Plattform (JVM) • ’Kritische Masse’ scheint erreicht (scala-Tag #130 bei stackoverflow; noch vor math, testing, java-ee oder tomcat) • Ist nicht mehr ’bleeding edge’ (aktuell Version 2.9, entwickelt seit 2003) • Mehr Gründe auf http://www.scala-lang.org16. November 2011 c 2011 UNIVERSITÄT ROSTOCK | FAKULTÄT FÜR INFORMATIK UND ELEKTROTECHNIK 4
  5. 5. Motivation • Scala = Scalable Language • Soll mit Nutzeranforderungen wachsen • Skript ⇐⇒ Große Anwendung • Statisch getypt (wie Java) • Unterstützt objektorientierte UND funktionale Programmierung • Weniger Boilerplate (kann Codelänge um 50% – 90% reduzieren)16. November 2011 c 2011 UNIVERSITÄT ROSTOCK | FAKULTÄT FÜR INFORMATIK UND ELEKTROTECHNIK 5
  6. 6. Material• Gutes Buch vom Entwickler der Sprache (Martin Odersky)• Erste Auflage frei verfügbar: http://www.artima.com/pins1ed/• Blog-Serie Scala for Java Refugees: http://www.codecommit.com/blog/scala/ roundup-scala-for-java-refugees 16. November 2011 c 2011 UNIVERSITÄT ROSTOCK | FAKULTÄT FÜR INFORMATIK UND ELEKTROTECHNIK 6
  7. 7. Funktionale Programmierung1 1. Funktionen sind Objekte erster Klasse 2. Funktionen haben keine Seiteneffekteval meineFunktion = (x:Int, y:Int) => x + yprintln(meineFunktion(1,1))(Ein Welt für sich, Grundidee bereits durch λ-Kalkül von Church entwickelt.Beliebte funktionale Sprachen: Scheme, Haskell, OCaml, F#) 1 Aus Sicht der Scala-Entwickler :)16. November 2011 c 2011 UNIVERSITÄT ROSTOCK | FAKULTÄT FÜR INFORMATIK UND ELEKTROTECHNIK 7
  8. 8. Maps, Operatoren & das Factory-Pattern var capital = Map("US" -> "Washington", "France" -> "Paris") capital += ("Japan" -> "Tokyo") println(capital("France")) Codebeispiel aus Odersky et al., Programming in Scala, 2008Warum leicht lesbar? • Typinferenz • Factory-Methode ’versteckt’ • Sinvolle Operatoren • Vordefinierte Funktionen16. November 2011 c 2011 UNIVERSITÄT ROSTOCK | FAKULTÄT FÜR INFORMATIK UND ELEKTROTECHNIK 8
  9. 9. Interoperabilität mit Java / Neue Typen erzeugen{ import java.math.BigInteger def factorial(x: BigInteger): BigInteger = if (x == BigInteger.ZERO) BigInteger.ONE else x.multiply(factorial(x.subtract(BigInteger.ONE))) println(factorial(BigInteger.TEN))} Codebeispiel aus Odersky et al., Programming in Scala, 2008def factorial(x: BigInt): BigInt = if (x == 0) 1 else x * factorial(x - 1)println(factorial(10)) Codebeispiel aus Odersky et al., Programming in Scala, 200816. November 2011 c 2011 UNIVERSITÄT ROSTOCK | FAKULTÄT FÜR INFORMATIK UND ELEKTROTECHNIK 9
  10. 10. Neue Kontrollstrukturen erzeugen2 actor { var sum = 0 loop { receive { case Data(bytes) => sum += hash(bytes) case GetSum(requester) => requester ! sum } } } Codebeispiel aus Odersky et al., Programming in Scala, 2008 2 Diese hier sind von Erlang geborgt :-)16. November 2011 c 2011 UNIVERSITÄT ROSTOCK | FAKULTÄT FÜR INFORMATIK UND ELEKTROTECHNIK 10
  11. 11. Weniger Boilerplate (durch ’Properties’) class MyClass { private int index; private String name; public MyClass(int index, String name) { this.index = index; this.name = name; } } Codebeispiel aus Odersky et al., Programming in Scala, 2008class MyClass(index: Int, name: String) Codebeispiel aus Odersky et al., Programming in Scala, 200816. November 2011 c 2011 UNIVERSITÄT ROSTOCK | FAKULTÄT FÜR INFORMATIK UND ELEKTROTECHNIK 11
  12. 12. Weniger Boilerplate (durch funktionaleProgrammierung) boolean nameHasUpperCase = false; for (int i = 0; i < name.length(); ++i) { if (Character.isUpperCase(name.charAt(i))) { nameHasUpperCase = true; break; } } Codebeispiel aus Odersky et al., Programming in Scala, 2008val nameHasUpperCase = name.exists(_.isUpperCase) Codebeispiel aus Odersky et al., Programming in Scala, 200816. November 2011 c 2011 UNIVERSITÄT ROSTOCK | FAKULTÄT FÜR INFORMATIK UND ELEKTROTECHNIK 12
  13. 13. Weniger Boilerplate (durch Support für n-Tupel)3//In James II wäre das:import james.core.util.misc.Pair;//...Pair<Integer,String> pair = new Pair<Integer,String>(99,"Luftballons");System.out.println(pair.getFirstValue());System.out.println(pair.getSecondValue());var pair = (99, "Luftballons")println(pair._1)println(pair._2) Codebeispiel aus Odersky et al., Programming in Scala, 2008 3 ∀n ≤ 2216. November 2011 c 2011 UNIVERSITÄT ROSTOCK | FAKULTÄT FÜR INFORMATIK UND ELEKTROTECHNIK 13
  14. 14. GrundideenFunktionen... • geben immer etwas zurück (zumindest Unit) • können teilweise definiert werden (⇒ Currying/Closures) • werden genauso behandelt wie Werte (⇒Werte sind konstante Funktionen)4 • können lokale Funktionen enthalten • können echt seltsame Namen haben, z.B. +, +=, ::, / • können unterschiedlich aufgerufen werden 4 Konvention: myObject.x hat keine Seiteneffekte, myObject.x() schon16. November 2011 c 2011 UNIVERSITÄT ROSTOCK | FAKULTÄT FÜR INFORMATIK UND ELEKTROTECHNIK 14
  15. 15. Aufruf von Funktionenclass MeineKlasse { def verdoppeln(x: Int) = 2 * x def <<(x: Int) = verdoppeln(x)}val meinObjekt = new MeineKlasse()println(meinObjekt.verdoppeln(2))println(meinObjekt.<<(2))println(meinObjekt verdoppeln 2)println(meinObjekt << 2)16. November 2011 c 2011 UNIVERSITÄT ROSTOCK | FAKULTÄT FÜR INFORMATIK UND ELEKTROTECHNIK 15
  16. 16. Aufruf von Funktionendef main(args: Array[String]) {args.foreach((arg: String) => println(arg))args.foreach(arg => println(arg))args.foreach(println(_))args.foreach(println)}16. November 2011 c 2011 UNIVERSITÄT ROSTOCK | FAKULTÄT FÜR INFORMATIK UND ELEKTROTECHNIK 16
  17. 17. Grundideen • Mehrere public Klassen pro Datei erlaubt. • Keine primitiven Datentypen mehr (1.toString ist OK) • Imports haben einen Gültigkeitsbereich • Sichtbarkeit kann sehr feingranular eingestellt werden (z.B. protected[my.package], private[this]) • Objects sind Singletons (und enthalten alle statischen Methoden, static gibt es also nicht) • Implizite Typumwandlungen • case classes für Pattern Matching16. November 2011 c 2011 UNIVERSITÄT ROSTOCK | FAKULTÄT FÜR INFORMATIK UND ELEKTROTECHNIK 17
  18. 18. Was ist (fast) gleich? • Grundlegende Organisation des Codes (Pakete + Klassen) • Kontrollstrukturen wie for, while, if etc. (teilw. mächtiger, z.B. switch ⇒ match) • Klassenbibliothek (Collections etc.) • Speicherverwaltung (new wird jedoch weniger benutzt, wegen Companion Objects und FP) • Fehlerbehandlung (Exceptions)16. November 2011 c 2011 UNIVERSITÄT ROSTOCK | FAKULTÄT FÜR INFORMATIK UND ELEKTROTECHNIK 18
  19. 19. Jetzt mal ein konkretes Beispiel...16. November 2011 c 2011 UNIVERSITÄT ROSTOCK | FAKULTÄT FÜR INFORMATIK UND ELEKTROTECHNIK 19
  20. 20. Rationale Zahlen nSind Zahlen der Form d mit n ∈ Z, d ∈ N ("‘Brüche"’)...bauen wir also eine Klasse: class Rational(n: Int, d: Int) Codebeispiel aus Odersky et al., Programming in Scala, 2008Mit verständlicher Ausgabe und Kontrolle der Eingabe: class Rational(n: Int, d: Int) { require(d != 0) override def toString = n +"/"+ d } Codebeispiel aus Odersky et al., Programming in Scala, 200816. November 2011 c 2011 UNIVERSITÄT ROSTOCK | FAKULTÄT FÜR INFORMATIK UND ELEKTROTECHNIK 20
  21. 21. Hinzufügen der Addition5 class Rational(n: Int, d: Int) { require(d != 0) val numer: Int = n val denom: Int = d override def toString = numer +"/"+ denom def add(that: Rational): Rational = new Rational( numer * that.denom + that.numer * denom, denom * that.denom ) } Codebeispiel aus Odersky et al., Programming in Scala, 2008 5 Geht eleganter, wird gleich noch ausgebaut...16. November 2011 c 2011 UNIVERSITÄT ROSTOCK | FAKULTÄT FÜR INFORMATIK UND ELEKTROTECHNIK 21
  22. 22. Hilfskonstruktor für n 1 class Rational(n: Int, d: Int) { require(d != 0) val numer: Int = n val denom: Int = d def this(n: Int) = this(n, 1) override def toString = numer +"/"+ denom def add(that: Rational): Rational = new Rational( numer * that.denom + that.numer * denom, denom * that.denom ) } Codebeispiel aus Odersky et al., Programming in Scala, 200816. November 2011 c 2011 UNIVERSITÄT ROSTOCK | FAKULTÄT FÜR INFORMATIK UND ELEKTROTECHNIK 22
  23. 23. GGT zur Vereinfachung des Bruchs class Rational(n: Int, d: Int) { private val g = gcd(n.abs, d.abs) val numer = n / g val denom = d / g def add(that: Rational): Rational = new Rational( numer * that.denom + that.numer * denom, denom * that.denom ) private def gcd(a: Int, b: Int): Int = if (b == 0) a else gcd(b, a % b) //... } Codebeispiel aus Odersky et al., Programming in Scala, 200816. November 2011 c 2011 UNIVERSITÄT ROSTOCK | FAKULTÄT FÜR INFORMATIK UND ELEKTROTECHNIK 23
  24. 24. ’Operatoren’ class Rational(n: Int, d: Int) { //... def + (that: Rational): Rational = new Rational( numer * that.denom + that.numer * denom, denom * that.denom ) def * (that: Rational): Rational = new Rational(numer * that.numer, denom * that.denom) def <(that: Rational) = this.num * that.denom < this.denom * that.num //... usw. } Codebeispiel aus Odersky et al., Programming in Scala, 200816. November 2011 c 2011 UNIVERSITÄT ROSTOCK | FAKULTÄT FÜR INFORMATIK UND ELEKTROTECHNIK 24
  25. 25. Unäre ’Operatoren’ und Backticksclass Rational(n: Int, d: Int) { //... def unary_~() = new Rational(denom, num) def unary_-() = new Rational(-num, denom) //Sowas hier geht auch: def `ha<ll$>$%o !`: Int = 2 //... usw.}16. November 2011 c 2011 UNIVERSITÄT ROSTOCK | FAKULTÄT FÜR INFORMATIK UND ELEKTROTECHNIK 25
  26. 26. ’Operatoren’ für andere Typen class Rational(n: Int, d: Int) { //... def + (i: Int): Rational = new Rational(numer + i * denom, denom) //... usw. } Codebeispiel aus Odersky et al., Programming in Scala, 200816. November 2011 c 2011 UNIVERSITÄT ROSTOCK | FAKULTÄT FÜR INFORMATIK UND ELEKTROTECHNIK 26
  27. 27. Implizite Typumwandlungclass Rational(n: Int, d: Int)//...object TestRationals { implicit def intToRational(x: Int) = new Rational(x) def main(args: Array[String]) { val oneHalf = new Rational(1, 2) val twoThirds = new Rational(20, 30) println(oneHalf + twoThirds) println(oneHalf < twoThirds) println(new Rational(3)) println(~oneHalf) println(oneHalf * 5 - oneHalf) println(5 * oneHalf) }}16. November 2011 c 2011 UNIVERSITÄT ROSTOCK | FAKULTÄT FÜR INFORMATIK UND ELEKTROTECHNIK 27
  28. 28. Vorsicht! "‘[...]creating methods with operator names and defining implicit conversions can help you design libraries for which client code is concise and easy to understand. Scala gives you a great deal of power to design such easy-to-use libraries, but please bear in mind that with power comes responsibility. [...] Conciseness will often be a big part of that readability, but you can take conciseness too far. By designing libraries that enable tastefully concise and at the same time understandable client code, you can help those client programmers work productively."’ (p. 113, Odersky et al., Programming in Scala, 2. Ausgabe) Image source: user mostuncool, http://www.flickr.com/photos/mostuncool/102762603/16. November 2011 c 2011 UNIVERSITÄT ROSTOCK | FAKULTÄT FÜR INFORMATIK UND ELEKTROTECHNIK 28
  29. 29. ’Pimp-My-Library’ Patternimport java.io._import scala.io._class RichFile(file: File ) { def text = Source.fromFile( file ).mkString def text_=( s: String ) { val out = new PrintWriter( file ) try{ out.println( s ) } finally{ out.close } }}object RichFile { implicit def enrichFile( file: File ) = new RichFile( file )}//...val f = new File("/tmp/example.txt")f.text = "hello world" Von: http://stackoverflow.com/questions/6879427/scala-write-string-to-file-in-one-statement16. November 2011 c 2011 UNIVERSITÄT ROSTOCK | FAKULTÄT FÜR INFORMATIK UND ELEKTROTECHNIK 29
  30. 30. Praxis16. November 2011 c 2011 UNIVERSITÄT ROSTOCK | FAKULTÄT FÜR INFORMATIK UND ELEKTROTECHNIK 30
  31. 31. Tools • Eclipse-Integration: http://www.scala-ide.org • Test-Frameworks: JUnit etc. (Bytecode-kompatibel) • S CALA-Konsole • Interessante Frameworks, z.B. L IFT (http://liftweb.net/)16. November 2011 c 2011 UNIVERSITÄT ROSTOCK | FAKULTÄT FÜR INFORMATIK UND ELEKTROTECHNIK 31
  32. 32. Maven-Integration6 <!-- ... --> <dependency> <groupId>org.scala-lang</groupId> <artifactId>scala-compiler</artifactId> <version>2.9.0</version> </dependency> <dependency> <groupId>org.scala-lang</groupId> <artifactId>scala-library</artifactId> <version>2.9.0</version> </dependency> <!-- ... --> <build> <sourceDirectory>src/main/scala</sourceDirectory> <testSourceDirectory>src/test/scala</testSourceDirectory><plugins> <plugin> <groupId>org.scala-tools</groupId> <artifactId>maven-scala-plugin</artifactId> </plugin> <!-- ... --> 6 Benötigt Repository http://scala-tools.org/repo-releases16. November 2011 c 2011 UNIVERSITÄT ROSTOCK | FAKULTÄT FÜR INFORMATIK UND ELEKTROTECHNIK 32
  33. 33. Scripting#!/bin/shexec scala "$0" "$@"!#import java.io._import scala.collection.mutable.Setif(args.size < 2) {println("Usage: addAccess hgrc_file user1 [user2 ...]")sys.exit(0)}val singleLines = io.Source.fromFile(args(0)).mkString.split("n")val editedLines = singleLines.map(l => if(matches(l)) update(l) else l)val out = new PrintWriter(new File(args(0)))try{ out.println(editedLines.mkString("n")) } finally{ out.close }def matches(line:String) = line.matches(".*allow_(read|push).*=.*")def update(line:String) = {val splitLine = line.split("=")val elems = Set() ++ splitLine(1).split(",").map(_.trim) ++ args.toList.tailsplitLine(0).trim + " = " + elems.mkString(", ")}16. November 2011 c 2011 UNIVERSITÄT ROSTOCK | FAKULTÄT FÜR INFORMATIK UND ELEKTROTECHNIK 33
  34. 34. Zusammenfassung16. November 2011 c 2011 UNIVERSITÄT ROSTOCK | FAKULTÄT FÜR INFORMATIK UND ELEKTROTECHNIK 34
  35. 35. Zusammenfassung • Scala ist JVM-kompatibel • Scala ’wächst’ mit den Aufgaben • Scala ist ideal, um als Java-Programmierer FP zu lernen/anzuwenden • Scala bietet Java gegenüber viele kleine Verbesserungen, kann also auch ohne FP-Ambitionen genutzt werden16. November 2011 c 2011 UNIVERSITÄT ROSTOCK | FAKULTÄT FÜR INFORMATIK UND ELEKTROTECHNIK 35
  36. 36. Interessante Features die es nicht in den Überblickgeschafft haben • Actors (einfache nebenläufige Programmierung) • Traits (Interfaces mit Logik!) • Pattern Matching • Annotationen • Arrays • DSLs bauen (siehe Actors) • Unterstützung von XML & Regex16. November 2011 c 2011 UNIVERSITÄT ROSTOCK | FAKULTÄT FÜR INFORMATIK UND ELEKTROTECHNIK 36
  37. 37. AlternativenJava ohne Boilerplate: http://www.eclipse.org/Xtext/xtend’Echte’ funktionale Programmierung auf der JVM: http://clojure.orgScala in einfach:http://confluence.jetbrains.net/display/Kotlin16. November 2011 c 2011 UNIVERSITÄT ROSTOCK | FAKULTÄT FÜR INFORMATIK UND ELEKTROTECHNIK 37
  38. 38. Material zum Weitermachen • The busy Java developer’s guide to Scala: http://www.ibm.com/developerworks/java/library/ j-scala01228 • Programming Scala: http://ofps.oreilly.com/titles/9780596155957/ • Scala School: http://twitter.github.com/scala_school/ • 99 Scala Problems: http://aperiodic.net/phil/scala/s-99/16. November 2011 c 2011 UNIVERSITÄT ROSTOCK | FAKULTÄT FÜR INFORMATIK UND ELEKTROTECHNIK 38
  39. 39. Lizenzen • Bilder von Folie #2 & #28: Creative Commons BY-NC-SA 2.0 • Alle eigenen Inhalte ebenso Siehe: http://creativecommons.org/licenses/by-nc-sa/2.0/deed.de16. November 2011 c 2011 UNIVERSITÄT ROSTOCK | FAKULTÄT FÜR INFORMATIK UND ELEKTROTECHNIK 39

×