JIT: Using Option and Try in for-Expressions (Scala 3 Video)
Before we get into the next TDL lesson, I need to make sure you’re familiar with how the Option
, Try
, and Either
error-handling types work in for
expressions.
Option
When you have a function like this that returns an Option
:
import scala.util.control.Exception.allCatch
def makeInt(s: String): Option[Int] =
allCatch.opt(s.toInt)
You can use that function in a for
expression to yield a result:
val rez: Option[Int] =
for
a <- makeInt("1")
b <- makeInt("2")
c <- makeInt("3")
yield
a + b + c
// rez == Some(6)
To make this simpler, let’s get rid of makeInt
and replace it with just Some
values:
val rez: Option[Int] =
for
a <- Some(1)
b <- Some(2)
c <- Some(3)
yield
a + b + c
As shown in that code, I declare that rez
has the type Option[Int]
. When you use one or more Option
values in a for
/yield
expression, the resulting value will also be an Option
, as indicated there. So that’s the first important thing to know:
When a
for
expression works withOption
values and yields a result, that result is also anOption
.
A second key to know is that inside the for
expression and yield
area, the values a
, b
, and c
have the “success” type that’s inside the Option
. Restating this second key point:
Inside the
for
andyield
areas, the valuesa
,b
, andc
have the data type that’s inside theOption
. In those two areas you work with the “success” type that’s contained within theOption
.
Try works the same way
And then a third important thing to know is that Try
works the same as Option
:
import scala.util.{Try, Success, Failure}
val rez: Try[Int] =
for
a <- Success(1)
b <- Success(2)
c <- Success(3)
yield
a + b + c
// rez == Success(6)
In this for
expression the same two keys apply:
- When a
for
expression works withTry
values and yields a result, the result is aTry
. - Inside the
for
andyield
areas, the valuesa
,b
, andc
have the “success” data type that’s inside theTry
. (In those two areas you work with that success type.)
(For many more details, see my book, Functional Programming, Simplified.)
Update: All of my new videos are now on
LearnScala.dev