Slide 9
Slide 9 text
ZIO
元々はscalaz8のIOモナドとして開発されていたライブラリだが、現在はスタンドアロンなライブラリとしてリリースされている。
IOモナドとは元々Haskellの技術で副作用をコンテキストとして持つ値で、副作用が失敗したときの例外処理などをハンドリ
ング/mask/割り込みなどのための様々な関数が定義されている。正しく言うと
IO自体はただのデータ型でIOデータ型がモナ
ド型クラスを実装している。
ScalaでのIOモナドは並列処理周りの実装やヘルパー関数も定義されており、
HaskellのIOモナ
ドよりさらに機能が拡張されている場合が多い。
IO値は遅延性のタスクであり、定義のみでは実行されず
run関数を発火する
ことで実行することができる、さらに
IOは再利用可能であるため、
run関数はなんども呼び出すことができる
(その度に副作用
タスクが実行される)。IOはモナドを実装しているため合成が可能で、一般的には
for syntaxを利用して逐次処理同様に書く
ことができる。scalaに置けるIOの代表的な実装としてはcats.effect.IOがあり、IOの類似や派生としてmonix TaskやZIOが
存在する。これらは総称してエフェクトラッパーと呼ばれることがある。
ZIOはIOモナドにさらにDI機能を追加したりエラー型を
任意の型に束縛できるようにしたりとさらにリッチにしたもので型として
ZIO[R, E, A]となりRがDIするmoduleの型、Eがエ
ラー型、AがIOタスクの戻り値となる。Rの値にはaccessM関数でアクセスすることが可能でこれの戻り値は
ZIOとなり、つま
りRにアクセスする場合は必ず
ZIOコンテキストになる。ZIOはそのほかにもSTMやStreamなど並列処理を行うに当たって
有用なモジュールも提供されており、大体の処理を
ZIOのみで完結できるようになっている、反対に
cats.effect.IOなどとの相
互変改も提供されており他エフェクトラッパーとの共存や、移行などもやりやすいようになっている。