Meeting 19 - Encapsulating Effects

Author

Bor-Yuh Evan Chang

Published

Tuesday, October 29, 2024

\(\newcommand{\TirName}[1]{\text{#1}} \newcommand{\inferrule}[3][]{ \let\and\qquad \begin{array}{@{}l@{}} \TirName{#1} \\ \displaystyle \frac{#2}{#3} \end{array} } \newcommand{\infer}[3][]{\inferrule[#1]{#2}{#3}} \)

What questions does your neighbor have?

Announcements

  • Lab 4 due Monday Tuesday 6pm
    • Implement static typing (from last Tuesday’s chapter and lecture)
    • Apply higher-order methods for List and Map from HW4
    • For immutable objects and multi-parameter functions, reading semantics
  • Lab 4 Leaderboards (Nastiness and Robustness competitions for extra credit).
  • Review 3-4 Thursday and Friday
    • Sign up on Canvas – needed to get assignment points
    • Scored on the quality of your feedback for your partner, not how you were assessed by your partner
    • Submit on Gradescope as a group — to get each other’s feedback
    • 0 for no-shows
  • Exam 3-4 next Tuesday 11/5
    • 50 minutes in class

Today

Questions?

  • Review:
    • What is static type checking and what is the benefit?

Questions?

Error Effects

Exceptions

defined function toDoubleException
res0_1: Double = 1.0
res0_2: Double = 4.2

Option

defined function toDoubleOption
defined function toDoubleNoNaNOption
defined function toDoubleOption
res3_1: Option[Double] = Some(value = 1.0)
res3_2: Option[Double] = Some(value = 4.2)
res3_3: Option[Double] = None
defined function toDoubleNoNaNOption
res4_1: Option[Double] = None
res4_2: Option[Double] = None
res4_3: Option[Double] = None
res4_4: Option[Double] = None
defined function addToDoubleOption
res5_1: Option[Double] = Some(value = 5.2)
res5_2: Option[Double] = None
res5_3: Option[Double] = None

Option as a Collection

defined function toDoubleNoNaNOption
defined function addToDoubleOption
defined function toDoubleNoNaNOption
defined function addToDoubleOption
res9_1: Option[Double] = Some(value = 5.2)
res9_2: Option[Double] = None
res9_3: Option[Double] = None

Map, Filter, FlatMap

Exercise 1 Implement map for Option[A]s:

defined function map

Exercise 2 Implement filter for Option[A]s:

defined function filter

Exercise 3 Implement flatMap for Option[A]s:

defined function flatMap

Comprehensions

defined function addToDoubleOption
defined function addToDoubleOption
res14_1: Option[Double] = Some(value = 5.2)
res14_2: Option[Double] = None
res14_3: Option[Double] = None

Either and Try

defined function toDoubleEither
defined function addToDoubleEither
import scala.util.Try
defined function toDoubleTry
defined function addToDoubleTry
defined function toDoubleEither
import scala.util.Try
defined function toDoubleTry

Mutation Effects

defined function freshVarImperative
defined function freshVar
freshVar: Int => (Int, String) = ammonite.$sess.cmd22$Helper$$Lambda$2244/0x0000000800b87840@3d5721bd
counter: Int = 0
counter_: Int = 1
x0: String = "x0"
counter__: Int = 2
x1: String = "x1"
counter___: Int = 3
x2: String = "x2"
counter: Int = 0
x0: String = "x0"
x1: String = "x1"
x2: String = "x2"

Encapsulating Mutation Effects

defined type DoWith
res25: Int => (Int, String) = ammonite.$sess.cmd22$Helper$$Lambda$2244/0x0000000800b87840@3d5721bd
defined function map
defined function flatMap
counter: Int = 0
defined function map
defined function flatMap
counter: Int = 0
counter___: Int = 3
x0: String = "x0"
x1: String = "x1"
x2: String = "x2"

DoWith

defined class DoWith
defined object DoWith
import DoWith._
defined function freshVar
counter: Int = 0
defined function freshVar
res35_1: (Int, String) = (1, "x0")
defined function freshVar
res36_1: (Int, String) = (1, "x0")
counter: Int = 0
counter___: Int = 3
x0: String = "x0"
x1: String = "x1"
x2: String = "x2"
counter: Int = 0
counter___: Int = 3
x0: String = "x0"
x1: String = "x1"
x2: String = "x2"