Skip to main content
Version: 1.0.18

Getting Started

Include ZIO in your project by adding the following to your build.sbt file:

libraryDependencies += "dev.zio" %% "zio" % "1.0.18"

If you want to use ZIO streams, you should also include the following dependency:

libraryDependencies += "dev.zio" %% "zio-streams" % "1.0.18"

Mainโ€‹

Your application can extend App, which provides a complete runtime system and allows you to write your whole program using ZIO:

import zio.console._

object MyApp extends zio.App {

def run(args: List[String]) =
myAppLogic.exitCode

val myAppLogic =
for {
_ <- putStrLn("Hello! What is your name?")
name <- getStrLn
_ <- putStrLn(s"Hello, ${name}, welcome to ZIO!")
} yield ()
}

The run method should return a ZIO value which has all its errors handled,
which, in ZIO parlance, is an unexceptional ZIO value.

One way to do this is to invoke fold over a ZIO value, to get an unexceptional ZIO value. That requires two handler functions: eh: E => B (the error handler) and ah: A => B (the success handler).

If myAppLogic fails, eh will be used to get from e: E to b: B; if it succeeds, ah will be used to get from a: A to b: B.

myAppLogic, as folded above, produces an unexceptional ZIO value, with B being Int.
If myAppLogic fails, there will be a 1; if it succeeds, there will be a 0.


If you are integrating ZIO into an existing application, using dependency injection, or do not control your main function, then you can create a runtime system in order to execute your ZIO programs:

import zio._

object IntegrationExample {
val runtime = Runtime.default

runtime.unsafeRun(Task(println("Hello World!")))
}

Ideally, your application should have a single runtime, because each runtime has its own resources (including thread pool and unhandled error reporter).

Consoleโ€‹

ZIO provides a module for interacting with the console. You can import the functions in this module with the following code snippet:

import zio.console._

If you need to print text to the console, you can use putStr and putStrLn:

// Print without trailing line break
putStr("Hello World")
// res8: ZIO[Console, java.io.IOException, Unit] = zio.ZIO$Read@18df26a1

// Print string and include trailing line break
putStrLn("Hello World")
// res9: ZIO[Console, java.io.IOException, Unit] = zio.ZIO$Read@52b30dcd

If you need to read input from the console, you can use getStrLn:

val echo = getStrLn.flatMap(line => putStrLn(line))
// echo: ZIO[Console, java.io.IOException, Unit] = zio.ZIO$FlatMap@49de1505

Learning Moreโ€‹

To learn more about ZIO, see the Overview.

ZIO Chat

๐Ÿ”ฅ Ignite your ZIO journey with ZIO Chat! ๐Ÿ”ฅ Ready to unravel the intricacies of ZIO? As your trusty sidekick, I'm here to light the way. No matter if you're wandering through functional forests or traversing effectful landscapes, I've got answers to keep you on track. Your ZIO adventure starts here โ€“ ask me anything and let's explore together!