Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Introducing Scala
IQSS Tech-Talk, 2013-06-27
Michael Bar-Sinai
Sunday, 4 August, 13
Based in part on Scala for the impatient, Scala for
java programmers tutorial at Typesafe.com, and Prof.
Mayer Goldberg ad...
In a Few Bullets
Developed in 2001, by Martin Odersky, EPFL Professor
Runs on the JVM (also, CLR)
Statically typed and wit...
In a Few Bullets
Developed in 2001, by Martin Odersky, EPFL Professor
Runs on the JVM (also, CLR)
Statically typed and wit...
In a Few Bullets
Developed in 2001, by Martin Odersky, EPFL Professor
Runs on the JVM (also, CLR)
Statically typed and wit...
Sunday, 4 August, 13
What is a...
Computation?
Sunday, 4 August, 13
What is a computation?
PROCEDURAL
Finite automaton working on
an infinite tape
...0 1 110101110
Sunday, 4 August, 13
What is a computation?
PROCEDURAL FUNCTIONAL
Finite automaton working on
an infinite tape
...0 1 110101110
Data flowing thro...
REPL
SEE ACCOMPANYING FILES
Sunday, 4 August, 13
List Operations
Run some binary operator on the list items and an
intermediate results
fold, reduce, scan
Concurrent: aggr...
List Operations
Run some binary operator on the list items and an
intermediate results
fold, reduce, scan
Concurrent: aggr...
Expressions vs. Statements
STATEMENT
if ( map contains x ) {
map(x) = computeNewX(map(x))
} else {
map(x) = computeNewX( 0...
Expressions vs. Statements
STATEMENT
EXPRESSION
if ( map contains x ) {
map(x) = computeNewX(map(x))
} else {
map(x) = com...
Expressions vs. Statements
STATEMENT
EXPRESSION
if ( map contains x ) {
map(x) = computeNewX(map(x))
} else {
map(x) = com...
Class Syntax
Classes have a primary constructor that is part of
the class definition
Clients can’t distinguish between gett...
Classes
class Person( var name:String, val id:Int ) {
! def greet = "Hello, my name is %s".format(name)
}
class Person2( n...
Classes (cont.)
class Person4( aName:String, anId:Int ) {
! private val id = anId
! private[this] var pName = aName
! def ...
Multiple Inheritance
Would have been nice if it worked
It doesn’t
Java allowed only multiple
inheritance of interfaces
JDK...
Traits
Almost like class:
Can have fields, protocols and behavior
(implementations)
Can’t have constructor parameters
Can r...
Objects
and the absence of static
Replace the static parts in java
Manual declaration of a runtime singletons
Classes can ...
Pattern Matching
Control structure that allows
switching
type inquiry
variable de-composition
Specialized Classes optimize...
Simple Pattern Matching
def toFuzzyStringInt( i:Int ) = i match {
! case 0 => "Nada"
! case 1 => "One"
! case 2 => "A Pair...
Switch by Type
def prettyPrint( a:Any ) = a match {
! case i:Int => "%,d".format(i)
! case s:String => "[%s]".format(s)
! ...
Decomposition
First, meet the case class:
Regular class, but with immutable declared fields,
toString, equals and hashCode ...
Decomposition
def evalTree( t:Tree, e:Map[String,Int] ): Int =
t match {
! case Sum(l,r) => evalTree(l, e) + evalTree(r,e)...
... In the real world
(merged,original) match {
case ( Pass(_), ( _, _) ) => true
case ( Unfixable(_), ( _, _) ) => false
...
... In the real world
(merged,original) match {
case ( Pass(_), ( _, _) ) => true
case ( Unfixable(_), ( _, _) ) => false
...
Option[T]
And the death of the NullPointerException
Indicates possibly missing values
Has two implementations: None and So...
Functions as values
Creating new functions from existing ones
Powerful tool, but can get messy
Allows for DSL creation
def...
Not Covered
Creation of DSLs
Implicit conversions
Continuations
Frameworks
XML
Parsers/Combinators
Macros
Annotations
Gene...
Pointers
www.scala-lang.org
Typesafe.com
Scala for the Impatient, by Cay Horstmann (http://
horstmann.com/scala/)
First ch...
Introducing Scala
IQSS Tech-Talk, 2013-06-27
Michael Bar-Sinai
THANKS
Sunday, 4 August, 13
Upcoming SlideShare
Loading in …5
×

Invitation to Scala

3,054 views

Published on

These are the slides for the talk I gave in Harvard IQSS's "tech talk" series. The commands and files for the demo ("REPL") part of the lecture can be obtained here: http://www.mbarsinai.com/blog/2013/08/04/invitation-to-scala/.

Published in: Technology

Invitation to Scala

  1. Introducing Scala IQSS Tech-Talk, 2013-06-27 Michael Bar-Sinai Sunday, 4 August, 13
  2. Based in part on Scala for the impatient, Scala for java programmers tutorial at Typesafe.com, and Prof. Mayer Goldberg advanced programming class in Ben-Gurion university of the Negev, Israel Sunday, 4 August, 13
  3. In a Few Bullets Developed in 2001, by Martin Odersky, EPFL Professor Runs on the JVM (also, CLR) Statically typed and with concise syntax Object oriented and functional Clean and elegant design Strong collection framework Expression-only, DSL friendly, advanced features Sunday, 4 August, 13
  4. In a Few Bullets Developed in 2001, by Martin Odersky, EPFL Professor Runs on the JVM (also, CLR) Statically typed and with concise syntax Object oriented and functional Clean and elegant design Strong collection framework Expression-only, DSL friendly, advanced features Sunday, 4 August, 13
  5. In a Few Bullets Developed in 2001, by Martin Odersky, EPFL Professor Runs on the JVM (also, CLR) Statically typed and with concise syntax Object oriented and functional Clean and elegant design Strong collection framework Expression-only, DSL friendly, advanced features Sunday, 4 August, 13
  6. Sunday, 4 August, 13
  7. What is a... Computation? Sunday, 4 August, 13
  8. What is a computation? PROCEDURAL Finite automaton working on an infinite tape ...0 1 110101110 Sunday, 4 August, 13
  9. What is a computation? PROCEDURAL FUNCTIONAL Finite automaton working on an infinite tape ...0 1 110101110 Data flowing through a program f(x) /2 R f(6) 2 R Sunday, 4 August, 13
  10. REPL SEE ACCOMPANYING FILES Sunday, 4 August, 13
  11. List Operations Run some binary operator on the list items and an intermediate results fold, reduce, scan Concurrent: aggregate, reduce ndlrowolleH Sunday, 4 August, 13
  12. List Operations Run some binary operator on the list items and an intermediate results fold, reduce, scan Concurrent: aggregate, reduce ndlrowolleH Sunday, 4 August, 13
  13. Expressions vs. Statements STATEMENT if ( map contains x ) { map(x) = computeNewX(map(x)) } else { map(x) = computeNewX( 0 ) } Sunday, 4 August, 13
  14. Expressions vs. Statements STATEMENT EXPRESSION if ( map contains x ) { map(x) = computeNewX(map(x)) } else { map(x) = computeNewX( 0 ) } map(x) = if ( map contains x ) computeNewX( map(x) ) else computeNewX( 0 ) Sunday, 4 August, 13
  15. Expressions vs. Statements STATEMENT EXPRESSION if ( map contains x ) { map(x) = computeNewX(map(x)) } else { map(x) = computeNewX( 0 ) } map(x) = if ( map contains x ) computeNewX( map(x) ) else computeNewX( 0 ) ACTUAL SCALA CODE map(x) = computeNewX( map.getOrElse(x,0) ) Sunday, 4 August, 13
  16. Class Syntax Classes have a primary constructor that is part of the class definition Clients can’t distinguish between getters and direct field access Better privacy control Sunday, 4 August, 13
  17. Classes class Person( var name:String, val id:Int ) { ! def greet = "Hello, my name is %s".format(name) } class Person2( name:String, val id:Int ) { ! def greet = "Hello, my name is %s".format(name) } class Person3( name:String, val id:Int ) { ! val greet = "Hello, my name is %s".format(name) } Sunday, 4 August, 13
  18. Classes (cont.) class Person4( aName:String, anId:Int ) { ! private val id = anId ! private[this] var pName = aName ! def name = pName ! def name_=( newName:String ) { pName = newName } ! override def toString = "[Person4 id:%d name:%s]".format(id,name) } Sunday, 4 August, 13
  19. Multiple Inheritance Would have been nice if it worked It doesn’t Java allowed only multiple inheritance of interfaces JDK8 would update this, slightly Scala simulates multiple inheritance using type linearization Would have been nice if it worked ...it mostly does A B1 B2 C A B1 B2 C Sunday, 4 August, 13
  20. Traits Almost like class: Can have fields, protocols and behavior (implementations) Can’t have constructor parameters Can require minimal interface from implementing classes Class can extend as many as needed Types are generated at declaration point Sunday, 4 August, 13
  21. Objects and the absence of static Replace the static parts in java Manual declaration of a runtime singletons Classes can have “companion objects” that have the same name Good place for utility methods or special “apply” methods App trait allows script-like behavior Sunday, 4 August, 13
  22. Pattern Matching Control structure that allows switching type inquiry variable de-composition Specialized Classes optimized for this Sunday, 4 August, 13
  23. Simple Pattern Matching def toFuzzyStringInt( i:Int ) = i match { ! case 0 => "Nada" ! case 1 => "One" ! case 2 => "A Pair" ! case 12 => "a dozen" ! case _ if i<0 => "Less that zero" ! case _ => "%,d".format(i) } Sunday, 4 August, 13
  24. Switch by Type def prettyPrint( a:Any ) = a match { ! case i:Int => "%,d".format(i) ! case s:String => "[%s]".format(s) ! case sym:Symbol => ":%s".format(sym) ! case _ => a.toString } Sunday, 4 August, 13
  25. Decomposition First, meet the case class: Regular class, but with immutable declared fields, toString, equals and hashCode automatically defined sealed abstract class Tree case class Sum( l:Tree, r:Tree ) extends Tree case class Var( n:String ) extends Tree case class Con( v:Int ) extends Tree Sunday, 4 August, 13
  26. Decomposition def evalTree( t:Tree, e:Map[String,Int] ): Int = t match { ! case Sum(l,r) => evalTree(l, e) + evalTree(r,e) ! case Var( n ) => e(n) ! case Con( i ) => i } Allows downcasting, accessing sub-classes fields and varying actions based on the class of the parameter, in a single syntactical maneuver Sunday, 4 August, 13
  27. ... In the real world (merged,original) match { case ( Pass(_), ( _, _) ) => true case ( Unfixable(_), ( _, _) ) => false case ( Fixable(_,t,_), (t1,t2) ) => f.ld<ld(t1)+ld(t2) } Given two strings, we need to decide whether it is more likely that they are two separate words or one broken word Sunday, 4 August, 13
  28. ... In the real world (merged,original) match { case ( Pass(_), ( _, _) ) => true case ( Unfixable(_), ( _, _) ) => false case ( Fixable(_,t,_), (t1,t2) ) => f.ld<ld(t1)+ld(t2) } ere are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. e first method is far more difficult. -- C. A. R. Hoare, Turing Award lecture, 1980 Given two strings, we need to decide whether it is more likely that they are two separate words or one broken word Sunday, 4 August, 13
  29. Option[T] And the death of the NullPointerException Indicates possibly missing values Has two implementations: None and Some(t) “Collection of at most one item” Convention more than a language feature Sunday, 4 August, 13
  30. Functions as values Creating new functions from existing ones Powerful tool, but can get messy Allows for DSL creation def bind1( f:(Int,Int)=>Int, v:Int ) = (a:Int)=>f(a,v) Sunday, 4 August, 13
  31. Not Covered Creation of DSLs Implicit conversions Continuations Frameworks XML Parsers/Combinators Macros Annotations Genericity Type System Actors Regular Expressions Extractors ... many more Sunday, 4 August, 13
  32. Pointers www.scala-lang.org Typesafe.com Scala for the Impatient, by Cay Horstmann (http:// horstmann.com/scala/) First chapters available after registering with at Typesafe’s site (google) Sunday, 4 August, 13
  33. Introducing Scala IQSS Tech-Talk, 2013-06-27 Michael Bar-Sinai THANKS Sunday, 4 August, 13

×