HANDLING ERRORS WITHOUT EXCEPTIONS
FUNCTIONAL PROGRAMMING IN SCALA
SIDE EFFECT
CHAPTER 4
MAIN PROBLEMS WITH EXCEPTIONS
▸ Context dependence
▸ Exceptions are not type-safe
▸ Checked exceptions
def map[A,B](l: List[A])(f: A => B): List[B]
CHAPTER 4
EXAMPLE
// partial function

def mean(xs: Seq[Double]): Double =

if (xs.isEmpty)

throw new ArithmeticException("mean of
empty list!")

else xs.sum / xs.length



def mean1(xs: Seq[Double]): Double =

if (xs.isEmpty)

null

else xs.sum / xs.length
CHAPTER 4
EXAMPLE
// total function

def mean_1(xs: Seq[Double], onEmpty: Double):
Double =

if (xs.isEmpty) 

onEmpty

else 

xs.sum / xs.length
CHAPTER 4
OPTION
sealed trait Option[+A]



case class Some[+A](get: A) extends Option[A]



case object None extends Option[Nothing]
CHAPTER 4
HOW TO USE OPTION TYPE CORRECTLY
▸ Reference Option example
CHAPTER 4
STRUCTURAL RECURSION
▸ map
▸ flatMap
CHAPTER 4
MONAD
trait M[A] {
  def flatMap[B](f: A => M[B]): M[B]
}
def unit[A](x: A): M[A]
CHAPTER 4
REFERENCE
▸ Monad Design Pattern in Java
▸ Demystifying the Monad in Scala

Funcional Programming in Scala - Chapter 4