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などとの相 互変改も提供されており他エフェクトラッパーとの共存や、移行などもやりやすいようになっている。