Fakultät Informatik Institut für Software- und Multimediatechnik Professur Softwaretechnologie Programmierparadigmen und Sprachen Scala Paul Henke Dresden, 07.05.2009
Gliederung Hello World Scala? Features Demo TU Dresden, 07.05.2009 Scala Folie 2 von 21
Hello World object HelloWorld { def main(args: Array[String]) { println("hello, world!") TU Dresden, 07.05.2009 Scala Folie 3 von 21
Scala? Scalable Language wird von Martin Odersky (EPFL, Schweiz) seit 2001 entworfen und entwickelt statisch getypte Multiparadigmensprache verknüpft Objektorientierte Programmierung mit Funktionaler läuft auf der JVM sowie in.net vollständig in die jeweilige Umgebung integriert aktuelle Version 2.7.4 TU Dresden, 07.05.2009 Scala Folie 4 von 21
Features Klassen Einfach Vererbung Mixins (durch Traits) Alles wird als Objekt behandelt Type Inference XML als nativer Datentyp Schönfinkeln Partial Application First Class und Higher Order Functions Closures Structural Typing Pattern Matching Tupel Actors und Messages TU Dresden, 11.05.2009 Scala Folie 5 von 21
Syntax Semikolons unnötig keine Operatoren Methoden können Infix geschrieben werden Klammern können bei Methoden mit maximal einem Parameter weggelassen werden 1 + 2 statt 1.+(2) geeignet für Domain Specific Languages (durch viele Freiheiten in der Syntax) z.b. ScalaTest Framework collection should contain element 1.0 result should be >= 0 TU Dresden, 07.05.2009 Scala Folie 6 von 21
Klassenhierarchie TU Dresden, 07.05.2009 Scala Folie 7 von 21
Klassen class Person(name:String, age:int) { def Name:String = name def Age:Int = age var city:string = "" def sayhi { println("hi") override def tostring():string = name + " (" + age + ")" var p:person = new Person("Horst", 20) println(p.name) // Horst println(p) // Horst (20) p.sayhi() p.city = "Dresden" // Hi TU Dresden, 07.05.2009 Scala Folie 8 von 21
Singletons Objects es gibt keinen static Modifier object Math { def PI:Double = 3.14159 def pow(b:long,e:long) = { def sin(a:double) = { def cos(a:double) = { /*... */ println(math.pow(2,8)) // 256 TU Dresden, 07.05.2009 Scala Folie 9 von 21
Type Inference auf Typangaben kann ich den meisten Fällen verzichtet werden Variablen var x = 5 var y = "Scala x = "ist toll" // x:int // y:string // type mismatch var z = x * 10 // z:int Rückgabetyp von Funktionen def add(x:float, y:float) = { x+y // add(float, Float):Float TU Dresden, 07.05.2009 Scala Folie 10 von 21
Traits abstrakter Typ ähnlich wie Java Interfaces bzw abstrakte Klassen Mixin Composition -> Mehrfach Vererbung trait Occupation { var occupation = "" override def tostring = super.tostring + "(" + occupation + ")" trait Status { var status = "" override def tostring = super.tostring + "(" + status + ")" TU Dresden, 11.05.2009 Scala Folie 11 von 21
Traits class BetterPerson(n:String, a:int) extends Person(n,a) with Occupation with Status val bp = new BetterPerson("Alice", " 25) bp.occupation = "Student"; bp.status = "Married" println(bp) // Alice (25)(Student)(Married) TU Dresden, 11.05.2009 Scala Folie 12 von 21
Traits trait Ord[T] { def < (that: T): Boolean def <=(that: T): Boolean = (this < that) (this == that) def > (that: T): Boolean =!(this <= that) def >=(that: T): Boolean =!(this < that) class Rational(n: Int, d: Int) extends Ord[Rational] { /* */ def <(that: Rational) = numer * denom > that.numer * that.denom var r1 = new Rational(7,5) var r2 = new Rational(13,7) println(r1 > r2) // true TU Dresden, 11.05.2009 Scala Folie 13 von 21
First Class Functions Funktionen sind auch Objekte haben einen Typ können Variablen zugewiesen werden val printhi:() => Unit = () => println("hi") printhi() // "hi" val return5:() => Int = () => 5 return5() // 5 val add:(int,int) => Int = (x,y) => x+y add(7,3) // 10 TU Dresden, 07.05.2009 Scala Folie 14 von 21
Higher Order Functions Funktionen die andere Funktionen als Parameter nehmen oder zurück geben def exists[t](list:list[t], f:t => Boolean ):Boolean = { for(item <- list) if(f(item)) return true return false val l = List(2,3,5,7,8,10) println(exists(l, n => n % 4 == 0)) println(exists(l, n => n < 0)) println(exists(plist, p => p.age > 18)) // true // false // true TU Dresden, 07.05.2009 Scala Folie 15 von 21
Closures Funktionen die auf Variablen zugreifen können die in ihrem Scope liegen def findpersonbyname(name:string):person = { personlist.filter(p => p.name == name) var x = 3 val printx: () => Unit = () => println(x) printx() // 3 x = 23 printx() // 23 TU Dresden, 07.05.2009 Scala Folie 16 von 21
Tail Recursion def factorial(n:bigint):bigint = { if(n == 1) 1 else n * factorial(n-1) println(factorial(10)) // 3628800 println(factorial(5000)) // StackOverflowError def factorial2(akk:bigint,n:bigint):bigint = { if(n == 1) akk else factorial2(akk*n,n-1) println(factorial2(1,5000)) // 42285779 TU Dresden, 11.05.2009 Scala Folie 17 von 21
Currying ist die Umwandlung einer Funktion mit mehreren Argumenten in mehrere Funktionen mit je einem Argument def factorial3(akk:bigint)(n:bigint):bigint = { if(n == 1) akk else factorial2(akk*n n,n-1) println(factorial3(1)(7)) // 5400 Partial Application def fact = factorial3(1)_ println(fact(8)) // 40320 TU Dresden, 07.05.2009 Scala Folie 18 von 21
Pattern Matching def factorial4(akk:int, i:int):int = { i match { case 1 => akk case n => factorial2(akk*n, n-1) println(factorial4(1,9)) // 362880 def tup(exp:any) = { exp match { case (a,b) => println("matched:" + a + "," + b) case (a) => println("matched:" + a ) println(tup(5)) // Matched:5 println(tup(("bob",25))) // Matched:Bob,25 TU Dresden, 07.05.2009 Scala Folie 19 von 21
Quellen Offizielle Seite www.scala-lang.org Scala by Example http://www.scala-lang.org/docu/files/scalabyexample.pdf Scala Tutorial http://www.scala-lang.org/docu/files/scalatutorial.pdf ScalaTest Framework http://www.artima.com/scalatest/ A Weblog by Martin Odersky http://www.artima.com/weblogs/index.jsp?blogger=modersky p// / g/ jp gg www.wikipedia.de TU Dresden, 07.05.2009 Scala Folie 20 von 21
Fragen Fragen? TU Dresden, 07.05.2009 Scala Folie 21 von 21