Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf ·...

129
Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

Transcript of Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf ·...

Page 1: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

Essential Scala

Noel Welsh, @noelwelsh

underscore

Six Core Concepts for Learning Scala

Page 2: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

Introduction

Page 3: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

Overview

Page 4: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala
Page 5: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

1. Expressions, types, & values

2. Objects and classes

3. Algebraic data types

4. Structural recursion

5. Sequencing computation

6. Type classes

Page 6: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

1. Expressions, types, & values

2. Objects and classes

3. Algebraic data types

4. Structural recursion

5. Sequencing computation

6. Type classes

Page 7: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

Motivation

Page 8: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

There are simple patterns in effective use of Scala

Page 9: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

Improve the teaching of Scala

Page 10: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

Huge thanks to the PLT teamhttp://racket-lang.org/

people.html

Page 11: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala
Page 12: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

Expressions, Types, and Values

Page 13: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

Goal: model of evaluation

Page 14: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

1 + 1 Expression

Page 15: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

1 + 1 Expression

TypeInt

Page 16: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

1 + 1 Expression

TypeInt

Value2

Page 17: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

Types exist at compile-time, values at run-time

Page 18: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

Basic language features, syntax

Page 19: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

Objects and Classes

Page 20: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

Goal: familiarity with syntax

Page 21: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

Objects and classes!

Page 22: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

Case classes and pattern matching

Page 23: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

Largely practicing syntax

Page 24: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

Algebraic Data Types

Page 25: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

Goal: translate data descriptions into code

Page 26: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

Model data with logical ors and logical ands

Page 27: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

A website visitor is: • logged in; or • anonymous

Page 28: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

A logged in user has: • an ID; and • an email address

Page 29: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

Structure of the code follows the structure of

the data

Page 30: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

Two patterns: • product types (and) • sum types (or)

Page 31: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

Product type: A has a B and C

Page 32: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

A has a B and C

final case class A(b: B, c: C)

Page 33: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

A has a B and C

final case class A(b: B, c: C)

Page 34: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

A has a B and C

final case class A(b: B, c: C)

Page 35: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

A has a B and C

final case class A(b: B, c: C)

Page 36: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

Sum type: A is a B or C

Page 37: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

A is a B or C

sealed trait A final case class B() extends A final case class C() extends A

Page 38: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

A is a B or C

sealed trait A final case class B() extends A final case class C() extends A

Page 39: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

A is a B or C

sealed trait A final case class B() extends A final case class C() extends A

Page 40: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

A is a B or C

sealed trait A final case class B() extends A final case class C() extends A

Page 41: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

Sum and product together make algebraic data types

Page 42: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

Examples

Page 43: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

A website visitor is: • logged in; or • anonymous

Page 44: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

sealed trait Visitor final case class Anonymous() extends Visitor final case class User() extends Visitor

Page 45: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

A logged in user has: • an ID; and • an email address

An anonymous has: • an ID

Page 46: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

sealed trait Visitor { id: Id } final case class Anonymous(id: Id) extends Visitor final case class User(id: Id, email: Email) extends Visitor

Page 47: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

A calculation is a success or failure

Page 48: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

sealed trait Calculation final case class Success() extends Calculation final case class Failure() extends Calculation

Page 49: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

A success has an value. A failure has an error

message

Page 50: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

sealed trait Calculation final case class Success(value: Int) extends Calculation final case class Failure(msg: String) extends Calculation

Page 51: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

Summary

• Structure data with logical ands and ors

• These are called algebraic data types

• Code follows immediately from structure of the data

Page 52: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

Structural Recursion

Page 53: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

Goal: transform algebraic data types

Page 54: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

sealed trait Calculation final case class Success(value: Int) extends Calculation final case class Failure(msg: String) extends Calculation

Page 55: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

Implement on Calculation

def add(value: Int): Calculation = ???

Page 56: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

Structure of the code follows structure of the

data

Page 57: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

Two (sub-)patterns: pattern matching and

polymorphism

Page 58: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

A is a B or CB has a D and EC has a F and G

Page 59: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

sealed trait A final case class B(d: D, e: E) extends A final case class C(f: F, g: G) extends A

Page 60: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

Pattern matching

Page 61: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

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

Page 62: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

Polymorphism

Page 63: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

sealed trait A { def doSomething: H } final case class B(d: D, e: E) extends A { def doSomething: H = doB(d, e) } final case class C(f: F, g: G) extends A { def doSomething: H = doC(f, g) }

Page 64: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

Example

Page 65: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

sealed trait Calculation final case class Success(value: Int) extends Calculation final case class Failure(msg: String) extends Calculation

Page 66: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

Add an Int to a Calculation

Page 67: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

sealed trait Calculation { def add(value: Int): Calculation = ??? }

final case class Success(value: Int) extends Calculation final case class Failure(msg: String) extends Calculation

Page 68: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

sealed trait Calculation { def add(value: Int): Calculation = this match { case Success(v) => ??? case Failure(msg) => ??? } }

final case class Success(value: Int) extends Calculation

final case class Failure(msg: String) extends Calculation

Page 69: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

sealed trait Calculation { def add(value: Int): Calculation = this match { case Success(v) => Success(v + value) case Failure(msg) => Failure(msg) } }

final case class Success(value: Int) extends Calculation

final case class Failure(msg: String) extends Calculation

Page 70: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

Summary

• Processing algebraic data types immediately follows from the structure of the data

• Can choose between pattern matching and polymorphism

• Pattern matching (within the base trait) is usually preferred

Page 71: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

Sequencing Computation

Page 72: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

Goal: patterns for sequencing computations

Page 73: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

Functional programming is about transforming values

Page 74: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

That is all you can do without introducing side-

effects

Page 75: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

A => B => C

Page 76: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

This is sequencing computations

Page 77: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

Three patterns: fold, map, and flatMap

Page 78: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

A B=>

Fold

Page 79: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

Abstraction over structural recursion

Page 80: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

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

Page 81: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

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

Page 82: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

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

Page 83: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

Example

Page 84: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

A Result is a Success or Failure

Page 85: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

sealed trait Result final case class Success() extends Result final case class Failure() extends Result

Page 86: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

Success contains a value of type A

Page 87: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

sealed trait Result[A] final case class Success[A](value: A) extends Result[A]

final case class Failure[A]() extends Result[A]

Page 88: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

(This just an invariant Option)

Page 89: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

Implement fold

Page 90: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

Start with structural recursion pattern

Page 91: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

sealed trait Result[A] { def fold[B]: B = this match { Success(v) => ??? Failure() => ??? } } final case class Success[A](value: A) extends Result[A] final case class Failure[A]() extends Result[A]

Page 92: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

Abstract out arguments

Page 93: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

sealed trait Result[A] { def fold[B](s: A => B, f: B): B = this match { Success(v) => s(v) Failure() => f } } final case class Success[A](value: A) extends Result[A] final case class Failure[A]() extends Result[A]

Page 94: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

Fold is a generic transform for any algebraic data type

Page 95: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

Fold is not always the best choice

Page 96: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

Not all data is an algebraic data type

Page 97: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

Sometimes other methods are easier to use

Page 98: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

Result[A]

Page 99: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

Get user from database (might not be a user)

Page 100: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

Convert user to JSON

Result[User]

Page 101: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

Result[User]

User => Json

Result[Json]

Page 102: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

Map

A B=>F[A] F[B]

map =

Page 103: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

Get user from database (might not be a user)

Page 104: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

Get order for user (might not be an order)

Result[User]

Page 105: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

Result[User]

User => Result[Order]

Result[Order]

Page 106: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

FlatMap

A F[B]=>F[A] F[B]

flatMap =

Page 107: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

Example

Page 108: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

getOrder(id: UserId): HttpResponse

Page 109: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

Order => Json

UserId

UserId => Result[User]

User => Result[Order]

Result[Json] => HttpResponse

Page 110: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

Order => Json

UserId

UserId => Result[User]

User => Result[Order]

Result[Json] => HttpResponse

Page 111: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

Order => Json

UserId

UserId => Result[User]

User => Result[Order]

Result[Json] => HttpResponse

???

Page 112: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

Order => Json

UserId

UserId => Result[User]

User => Result[Order]

Result[Json] => HttpResponse

flatMap

Page 113: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

Order => Json

UserId

UserId => Result[User]

User => Result[Order]

Result[Json] => HttpResponse

Page 114: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

Order => Json

UserId

UserId => Result[User]

User => Result[Order]

Result[Json] => HttpResponse

???

Page 115: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

Order => Json

UserId

UserId => Result[User]

User => Result[Order]

Result[Json] => HttpResponse

map

Page 116: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

Order => Json

UserId

UserId => Result[User]

User => Result[Order]

Result[Json] => HttpResponse

Page 117: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

Order => Json

UserId

UserId => Result[User]

User => Result[Order]

Result[Json] => HttpResponse

???

Page 118: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

Order => Json

UserId

UserId => Result[User]

User => Result[Order]

Result[Json] => HttpResponse

fold

Page 119: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

Summary

• Standard patterns for sequencing computations

• F[A] map (A => B) = F[B]

• F[A] flatMap (A => F[B]) = F[B]

• fold is general transformation for algebraic data types

• You can teach monads in an introductory course!

Page 120: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

Type Classes

Page 121: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

Ad-hoc polymorphism

Page 122: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

Break free from your class oppressors!

Page 123: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

Conclusions

Page 124: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

Scala is simple

Page 125: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

3 patterns are 90% of code

Page 126: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

4 patterns are 99% of code

Page 127: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

Program design in Scala is systematic

Page 128: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

Be like keyboard cat!

Page 129: Essential Scala - Lightbenddownloads.typesafe.com/.../ScalaDaysSF2015/essential-scala.pdf · Essential Scala Noel Welsh, @noelwelsh underscore Six Core Concepts for Learning Scala

underscore.io/training/

courses/essential-scala/