Essential Scala
Essential Scala
underscore
Introduction
Overview
1. Expressions, types, & values
2. Objects and classes
3. Algebraic data types
4. Structural recursion
5. Sequencing computation
6. Type classes
1. Expressions, types, & values
2. Objects and classes
3. Algebraic data types
4. Structural recursion
5. Sequencing computation
6. Type classes
Motivation
There are simple patterns
in effective use of Scala
Improve the teaching
of Scala
Huge thanks to the PLT team
http://racket-lang.org/
people.html
Expressions, Types, and
Values
Goal: model of
evaluation
1+1 Expression
Int Type
1+1 Expression
Int Type
1+1 Expression
2 Value
Types exist at compile-
time, values at run-time
Basic language
features, syntax
Objects and Classes
Goal: familiarity with
syntax
Objects and classes!
Case classes and
pattern matching
Largely practicing
syntax
Algebraic Data Types
Goal: translate data
descriptions into code
Model data with logical
ors and logical ands
A website visitor is:
logged in; or
anonymous
A logged in user has:
an ID; and
an email address
Structure of the code
follows the structure of
the data
Two patterns:
product types (and)
sum types (or)
Product type:
A has a B and C
final case class A(b: B, c: C)
A has a B and C
final case class A(b: B, c: C)
A has a B and C
final case class A(b: B, c: C)
A has a B and C
final case class A(b: B, c: C)
A has a B and C
Sum type:
A is a B or C
sealed trait A
final case class B() extends A
final case class C() extends A
A is a B or C
sealed trait A
final case class B() extends A
final case class C() extends A
A is a B or C
sealed trait A
final case class B() extends A
final case class C() extends A
A is a B or C
sealed trait A
final case class B() extends A
final case class C() extends A
A is a B or C
Sum and product together
make algebraic data types
Examples
A website visitor is:
logged in; or
anonymous
sealed trait Visitor
final case class Anonymous()
extends Visitor
final case class User()
extends Visitor
A logged in user has:
an ID; and
an email address
An anonymous has:
an ID
sealed trait Visitor {
id: Id
}
final case class Anonymous(id: Id)
extends Visitor
final case class User(id: Id, email: Email)
extends Visitor
A calculation is a
success or failure
sealed trait Calculation
final case class Success()
extends Calculation
final case class Failure()
extends Calculation
A success has an value.
A failure has an error
message
sealed trait Calculation
final case class Success(value: Int)
extends Calculation
final case class Failure(msg: String)
extends Calculation
Summary
A => B
Abstraction over
structural recursion
sealed trait A {
def doSomething: H = {
this match {
case B(d, e) => doB(d, e)
case C(f, g) => doC(f, g)
}
}
}
final case class B(d: D, e: E) extends A
final case class C(f: F, g: G) extends A
sealed trait A {
def doSomething: H = {
this match {
case B(d, e) => doB(d, e)
case C(f, g) => doC(f, g)
}
}
}
final case class B(d: D, e: E) extends A
final case class C(f: F, g: G) extends A
sealed trait A {
def fold(doB: (D, E) => H, doC: (F, G)
=> H): H = {
this match {
case B(d, e) => doB(d, e)
case C(f, g) => doC(f, g)
}
}
}
final case class B(d: D, e: E) extends A
final case class C(f: F, g: G) extends A
Example
A Result is a Success or
Failure
sealed trait Result
final case class Success() extends Result
final case class Failure() extends Result
Success contains a
value of type A
sealed trait Result[A]
Result[Json]
Map
map =
Result[Order]
FlatMap
flatMap =
Result[Json] =>
HttpResponse
UserId
UserId => Result[User]