まず最初に基本であるHello, World!
をコンソールに出力するプログラムを作成し、ZIOについて大まかに理解します。
セットアップ
※ビルドツールはsbt
を使います。
まず設定ファイルbuild.sbt
に以下の設定を記述し、ZIOのライブラリを読み込むようにします。
libraryDependencies ++= Seq (
"dev.zio" %% "zio" % "2.0.13"
)
また、IntelliJ IDEAで普段Scala開発をされている方は以下のプラグインをインストールされると良いかもしれません。
プログラム本体
object MainApp extends ZIOAppDefault {
def run: ZIO[Any, Throwable, Unit] = Console.printLine("Hello, World!")
}
実行
セットアップとプログラム本体の記述が終わったら、sbt run
で実行してください。
以下の様にコンソールに出力されたら成功です。
Hello, World!
プログラム本体の解説
Console.printLine("Hello, World!")
について
Console.printLine
の定義を確認するとIO[IOException, Unit]
を返す関数であることがわかります。
IO[+E, +A]
はZIO[Any, E, A]
の型エイリアスであるため、IO[IOException, Unit]
はZIO[Any, IOException, Unit]
を表していることがわかります。
ZIO型について
上記のZIO型の意味としては以下の様になっています。
type ZIO[R, E, A] = R => Either[E, A]
今回の場合は以下のようになります。
type ZIO[Any, IOException, Unit] = Any => Either[IOException, Unit]
後の章でも説明しますが、これはAny
型に依存し(Any型に依存するということは何にも依存していないことを意味しています)、IOException
型で失敗する可能性や処理が成功した場合、Unit
型を返す可能性があることを意味しています。
ZIO型を返す関数の実行について
ZIO型自体は処理の宣言の様なものであり、それ自体を直接呼び出したとしても実際の処理は行われません。
今回の場合、Console.printLine("Hello, World!")
を以下のような形で呼び出したとしてもコンソールにHello, World!
は出力されません。
object HelloWorld {
def main(args: Array[String]): Unit = {
Console.printLine("Hello, World!")
}
}
ZIO型を返す関数の処理自体を実行させるためには必ず今回のプログラム本体のようにZIOAppDefault
のrun
関数にZIO型を渡す必要があります。
終わりに
以上がZIOのHello, World!
プログラムとその解説でした。
次章では今回のZIO型の場合、Any
型で表されるZIOのDI(Dependency Injection)について詳しく見ていきます。
前章:ZIOについて
次章:ZIOのDIについて
演習
- 今回の
Hello, World!
プログラムを実際に動かしてください。- 解答例は以下になります。
https://github.com/hatuda/zio-practice/tree/CHAPTER1
- 解答例は以下になります。