Meeting 22 - Encapsulating Effects

Author

Bor-Yuh Evan Chang

Published

Thursday, November 7, 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

  • Remainder of the Semester
    • HW 5 and Lab 5 before Thanksgiving break
    • Unit 6 (probably one combined assignment) after Thanksgiving break
    • Exam 5-6 in the last week of classes before the Final
    • Possible extra credit project opportunity
  • Exam 3-4 grading in progress
    • See how the Review Exercises/Practice Exam translates to the exam.
    • Some questions were even exactly the same (1e on giving the small-step rules for const x = e1; e2)
  • Come see us to make a study plan
    • e.g., via the redo policy
    • see the Final Exam as an opportunity to show growth from mid-semester exams.
    • 25 minutes per unit x 6 units = 150 minutes

Today

Questions?

  • Review:
    • What is soundness (or unsoundness) of static typing?

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"