As a little note here today, here’s an example of how to use a Scala Either
inside a for
-expression when using ZIO 2. Specifically I convert each Either
into a ZIO
in each line of the for
-expression.
Here’s the ZIO code:
//> using scala "3"
//> using lib "dev.zio::zio::2.1.0"
package zio_either_test
import zio.*
import zio.Console.*
import java.io.IOException
import scala.util.control.Exception.*
def makeInt(s: String): Either[Throwable, Int] =
allCatch.either(s.toInt)
object ZioEitherInForExpr extends ZIOAppDefault:
val blueprint: ZIO[Any, Throwable, Int] =
for
a <- ZIO.fromEither(makeInt("1"))
b <- ZIO.fromEither(makeInt("uh oh"))
c <- ZIO.fromEither(makeInt("3"))
yield
a + b + c
val run = blueprint.foldZIO(
failure => printLineError(s"FAILURE = $failure"),
success => printLine( s"SUCCESS = $success")
)
Notice that makeInt
returns an Either
, but I want to use ZIO
values inside the for
-expression, so I convert each Either
into a ZIO
with ZIO.fromEither
.
When the string in the second line of the for
-expression is "uh oh"
, I see this output when I run this ZIO application:
$ scala-cli ZioEitherForExpression.scala
FAILURE = java.lang.NumberFormatException: For input string: "uh oh"
As I have noted in other articles and videos, that’s because the for
-expression short-circuits on that line of code.
But if I change that "uh oh"
to a "2"
, I see this output instead:
$ scala-cli ZioEitherForExpression.scala
SUCCESS = 6
In summary, if you wanted to see how to use ZIO 2 along with Either
and ZIO
values in a Scala for
-expression, I hope this little example is helpful. Also note that the same technique can be used with Scala Option
and Try
values, almost exactly as shown with the Either
values here.
this post is sponsored by my books: | |||
![]() #1 New Release |
![]() FP Best Seller |
![]() Learn Scala 3 |
![]() Learn FP Fast |