рдХреИрдЯреНрд╕ рдЗрдлрд╝реЗрдХреНрдЯ рд╕реНрдХреИрд▓рд╛-рджреБрдирд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ "рд░рд┐рдПрдХреНрдЯрд┐рд╡ рд╕реНрдЯреНрд░реАрдо" рдмрди рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЖрдк рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рд╕рдВрдкреВрд░реНрдг рд╡рд┐рд╡рд┐рдз рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ рдХреЛ рдПрдХ рд╕рд╛рде рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред
рдХрдИ рдЙрддреНрдХреГрд╖реНрдЯ рдкреБрд╕реНрддрдХрд╛рд▓рдп: http4s, fs2, doobie - рдХреЗрд╡рд▓ рдХреИрдЯреНрд╕ рдЗрдлреЗрдХреНрдЯ рд╕реЗ рдЯрд╛рдЗрдк рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдФрд░ ZIO рдФрд░ Monix рдЬреИрд╕реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА, рдмрджрд▓реЗ рдореЗрдВ, рдЕрдкрдиреЗ рдкреНрд░рднрд╛рд╡ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЗрди рдкреНрд░рдХрд╛рд░ рдХреА рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИрдВред рд╕рдВрд╕реНрдХрд░рдг 3.0 рдореЗрдВ рддрдп рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдХреБрдЫ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдХреИрдЯреНрд╕ рдЗрдлреЗрдХреНрдЯ рд╕реНрдХрд╛рд▓рд╛ рднрд╛рд╖рд╛ рдХреЗ рд╕рдВрдкреВрд░реНрдг рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рд░реВрдк рд╕реЗ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдЦреБрд▓реЗ рд╕реНрд░реЛрдд рдпреЛрдЧрджрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреА рдорджрдж рдХрд░рддрд╛ рд╣реИред рдмрд┐рд▓реНрд▓рд┐рдпреЛрдВ рдХреЗ рдкреНрд░рднрд╛рд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдПрдХ рдореБрд╢реНрдХрд┐рд▓ рд╡рд┐рдХрд▓реНрдк рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ: рдЬреЛ рдЕрдкрдиреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рднрд╛рд╡реЛрдВ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд░рддрд╛ рд╣реИред
рдЖрдЬ рддреАрди рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ:
- рдмрд┐рд▓реНрд▓рд┐рдпреЛрдВ IO, рд╕рдВрджрд░реНрдн рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди;
- рдореЛрдирд┐рдХреНрд╕, рдЯрд╛рд╕реНрдХ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдФрд░ рдХреЛрдб рдореЗрдВ рдЗрд╕рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓рддрд╛;
- ZIO, ZIO рдбреЗрдЯрд╛ рдЯрд╛рдЗрдк рдФрд░ рдЗрд╕рдХрд╛ рдХреНрд░реЙрд╕-рдереНрд░реЗрдбрд┐рдВрдЧ рд╕реНрдХреЛрдкред
рдЗрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ рдореИрдВ рдЖрдкрдХреЛ рдпрд╣ рд╕рд╛рдмрд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдХреИрдЯреНрд╕ рдЗрдлреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, ZIO рдбрд┐рдЬрд╛рдЗрди рд╕рдорд╛рдзрд╛рди рдФрд░ рдХреНрд╖рдорддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реИ рдЬреЛ рдХрд┐ рдХреИрдЯреНрд╕ IO рдореЗрдВ рд╕рдВрджрд░реНрдн рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рдХрд╛рдлреА рдЕрд▓рдЧ рд╣реИрдВред
1. рдмреЗрд╣рддрд░ рдПрдордЯреАрдПрд▓ / рдЯреИрдЧрд▓реЗрд╕-рдлрд╛рдЗрдирд▓ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░
рдПрдордЯреАрдПрд▓ (рдореЛрдирд╛рдб рдЯреНрд░рд╛рдВрд╕рдлрд╝реЙрд░реНрдорд░реНрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА) рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╢реИрд▓реА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдЙрдирдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рднрд╛рд╡ рд╕реЗ рдмрд╣реБрд░реВрдкреА рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ "рдкреНрд░рдХрд╛рд░ рд╡рд░реНрдЧ рдХреА рдХрдореА" рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдкрдиреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рддреЗ рд╣реИрдВред рд╕реНрдХрд╛рд▓рд╛ рдореЗрдВ, рдЗрд╕реЗ рдЕрдХреНрд╕рд░ рдЯреИрдЧрд▓реЗрд╕-рдЕрдВрддрд┐рдо рд╢реИрд▓реА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдПрдХ рд╣реА рдмрд╛рдд рдирд╣реАрдВ рд╣реИ), рдЦрд╛рд╕рдХрд░ рдЬрдм рдкреНрд░рдХрд╛рд░ рд╡рд░реНрдЧ рдореЗрдВ рдХреЛрдИ рдХрд╛рдиреВрди рдирд╣реАрдВ рд╣реИред
рдпрд╣ рд╕рд░реНрд╡рд╡рд┐рджрд┐рдд рд╣реИ рдХрд┐ рдРрд╕реЗ рдХреНрд▓рд╛рд╕рд┐рдХ рдПрдордЯреАрдПрд▓ рдкреНрд░рдХрд╛рд░ рд╡рд░реНрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рд░рд╛рдЗрдЯрд░ рдФрд░ рд╕реНрдЯреЗрдЯ, рд╕рд╛рде рд╣реА рдХреИрдЯреНрд╕ рдЖрдИрдУ рдЬреИрд╕реЗ рдкреНрд░рднрд╛рд╡ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдПред рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЗрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рднрд╛рд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдЗрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд░реНрдЧреЛрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдПрдХ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддреА рд░рд╛рдЬреНрдп рддрдХ рдкрд╣реБрдВрдЪ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬреЛ рд╡рд┐рд╢реНрд╡ рд╕реНрддрд░ рдкрд░ рдирд╣реАрдВ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддреА рд░рд╛рдЬреНрдп рдХрд╛ рдирд┐рд░реНрдорд╛рдг рднреА рдПрдХ рдкреНрд░рднрд╛рд╡ рд╣реИред
рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП, рд╣рд╛рд▓рд╛рдВрдХрд┐, "рдореЛрдирдб рдЯреНрд░рд╛рдВрд╕рдлрд╛рд░реНрдорд░" рд╕реЗ рдмрдЪрдирд╛ рдФрд░ рдореБрдЦреНрдп рдкреНрд░рднрд╛рд╡ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рд╕реАрдзреЗ рд▓рд┐рдЦрдирд╛ рдФрд░ рд░рд╛рдЬреНрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред
рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕реНрдХрд╛рд▓рд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдПрдХ рдЪрд╛рд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ: рд╡реЗ рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЗ рд╢реАрд░реНрд╖ рд╕реНрддрд░ рдкрд░ рдкреНрд░рднрд╛рд╡ рдХреЗ рд╕рд╛рде (рд▓реЗрдХрд┐рди рд╕рд╛рдл) рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рд╕реНрдерд╛рдиреАрдп рдирд┐рд╣рд┐рддрд╛рд░реНрде рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ:
Ref.make[AppState](initialAppState).flatMap(ref => implicit val monadState = new MonadState[Task, AppState] { def get: Task[AppState] = ref.get def set(s: AppState): Task[Unit] = ref.set(s).unit } myProgram )
рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреА рдЪрд╛рд▓ рдЙрдкрдпреЛрдЧреА рд╣реИ, рдпрд╣ рдЕрднреА рднреА рдПрдХ "рдмреИрд╕рд╛рдЦреА" рд╣реИред рдПрдХ рдЖрджрд░реНрд╢ рджреБрдирд┐рдпрд╛ рдореЗрдВ, рдкреНрд░рдХрд╛рд░ рд╡рд░реНрдЧреЛрдВ рдХреЗ рд╕рднреА рдЙрджрд╛рд╣рд░рдг рд╕реБрд╕рдВрдЧрдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ (рдкреНрд░рддрд┐ рдкреНрд░рдХрд╛рд░ рдПрдХ рдЙрджрд╛рд╣рд░рдг), рдФрд░ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдирд┐рд░реНрдорд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдкреНрд░рднрд╛рд╡ рдкреИрджрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдлрд┐рд░ рдмрд╛рдж рдХреЗ рддрд░реАрдХреЛрдВ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЦреБрдж рдХреЛ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдореВрд▓реНрдпреЛрдВ рдореЗрдВ рд▓рдкреЗрдЯ рд╕рдХрддрд╛ рд╣реИред
MTL / рдЯреИрдЧрд▓реЗрд╕-рдлрд╝рд╛рдЗрдирд▓ рдХреА рдПрдХ рдмрдбрд╝реА рд╡рд┐рд╢реЗрд╖рддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк ZIO рдкрд░реНрдпрд╛рд╡рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реАрдзреЗ ZIO рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
ZIO рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ MonadState рдкрд░рд┐рднрд╛рд╖рд╛ рдмрдирд╛рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдпрд╣рд╛рдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
trait State[S] { def state: Ref[S] } implicit def ZIOMonadState[S, R <: State[S], E]: MonadState[ZIO[R, E, ?], S] = new MonadState[ZIO[R, E, ?], S] { def get: ZIO[R, E, S] = ZIO.accessM(_.state.get) def set(s: S): ZIO[R, E, Unit] = ZIO.accessM(_.state.set(s).unit) }
рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЕрдм рд╡реИрд╢реНрд╡рд┐рдХ рд░реВрдк рд╕реЗ рдХрд┐рд╕реА рднреА рд╡рд╛рддрд╛рд╡рд░рдг рдХреЗ рд▓рд┐рдП рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдХрдо рд╕реЗ рдХрдо
State[S]
рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред
рдЗрд╕реА рддрд░рд╣
FunctorListen
, рдЕрдиреНрдпрдерд╛
MonadWriter
рд░реВрдк рдореЗрдВ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ:
trait Writer[W] { def writer: Ref[W] } implicit def ZIOFunctorListen[W: Semigroup, R <: Writer[W], E]: FunctorListen[ZIO[R, E, ?], W] = new FunctorListen[ZIO[R, E, ?], W] { def listen[A](fa: ZIO[R, E, A]): ZIO[R, E, (A, W)] = ZIO.accessM(_.state.get.flatMap(w => fa.map(a => a -> w))) def tell(w: W): ZIO[R, E, W] = ZIO.accessM(_.state.update(_ |+| w).unit) }
рдФрд░ рд╣рд╛рдВ, рд╣рдо
MonadError
рд▓рд┐рдП рднреА рдРрд╕рд╛ рд╣реА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
implicit def ZIOMonadError[R, E]: MonadError[ZIO[R, E, ?], E] = new MonadError[ZIO[R, E, ?], E]{ def handleErrorWith[A](fa: ZIO[R, E, A])(f: E => ZIO[R, E, A]): ZIO[R, E, A] = fa catchAll f def raiseError[A](e: E): ZIO[R, E, A] = ZIO.fail(e) }
рдпрд╣ рддрдХрдиреАрдХ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреА рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рд▓рд╛рдЧреВ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЯреИрдЧрд▓реЗрд╕-рдЕрдВрддрд┐рдо рдкреНрд░рдХрд╛рд░ рдХреА рдХрдХреНрд╖рд╛рдПрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдЙрддреНрдкрдиреНрди рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рднрд╛рд╡ (рдкрд░рд┐рд╡рд░реНрддрди, рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди), рдкрд░реАрдХреНрд╖рдг рдХрд╛рд░реНрдп рдЬреЛ рдкреНрд░рднрд╛рд╡ рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ (рдЯреИрдЧ рд░рд╣рд┐рдд-рдЕрдВрддрд┐рдо рдХреЗ рд╕рд╛рде рдкрд░реНрдпрд╛рд╡рд░рдг рдкреНрд░рднрд╛рд╡ рдХрд╛ рд╕рдВрдпреЛрдЬрди), рдпрд╛ рдкрд░реНрдпрд╛рд╡рд░рдг рд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕реБрд▓рдн рдХреБрдЫ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред ред
рдХреЛрдИ рдФрд░ рдЕрдзрд┐рдХ рдзреАрдореА рдЧрддрд┐ рд╕реЗ рд╡рд┐рд╡рд░реНрддрдирд┐рдХ рдкрд░рд┐рд╡рд░реНрддрди! рдХрдХреНрд╖рд╛ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рд╕реНрдерд╛рдиреАрдп рдирд┐рд╣рд┐рддрд╛рд░реНрдереЛрдВ рд╕реЗ рдЬреЛрдбрд╝рддреЗ рд╕рдордп рдкреНрд░рднрд╛рд╡ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП "рдирд╣реАрдВ" рдХрд╣реЗрдВред рдХреЛрдИ рдФрд░ рдЕрдзрд┐рдХ рдмреИрд╕рд╛рдЦреА рдХреА рдЬрд░реВрд░рдд рд╣реИред рд╢реБрджреНрдз рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдореЗрдВ рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд┐рд╕рд░реНрдЬрдиред
2. рдорд╛рддреНрд░ рдирд╢реНрд╡рд░ рдХреЗ рд▓рд┐рдП рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рдмрдЪрдд
ZIO рдХреА рдкрд╣рд▓реА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдЗрдВрдЯрд░рдЯреНрд░рдХреНрд╢рди рдереА - рдХрд┐рд╕реА рднреА рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдкреНрд░рднрд╛рд╡ рдХреЛ рддреБрд░рдВрдд рдмрд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП ZIO рд░рдирдЯрд╛рдЗрдо рдХреА рдХреНрд╖рдорддрд╛ рдФрд░ рд╕рднреА рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдореБрдХреНрдд рдХрд░рдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреАред рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рдПрдХ рдХреНрд░реВрдб рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдиреЗ рдХреИрдЯреНрд╕ рдЖрдИрдУ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд┐рдпрд╛ред
рд╣рд╛рд╕реНрдХреЗрд▓ рдиреЗ рдЗрд╕ рддрд░рд╣ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдПрд╕рд┐рдВрдХреНрд╕ рдЕрдкрд╡рд╛рдж рдХрд╣рд╛ рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рд╡рд┐рд▓рдВрдмрддрд╛, рдХреБрд╢рд▓ рд╕рдорд╛рдирд╛рдВрддрд░ рдФрд░ рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рд╕рдВрдЪрд╛рд▓рди, рдФрд░ рд╡рд┐рд╢реНрд╡ рд╕реНрддрд░ рдкрд░ рдЕрдиреБрдкрд╛рд▓рди рдмрдирд╛рдиреЗ рдФрд░ рдХреБрд╢рд▓рддрд╛рдкреВрд░реНрд╡рдХ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреЗ рд╡реНрдпрд╡рдзрд╛рди рди рдХреЗрд╡рд▓ рдорд╣рд╛рди рд▓рд╛рдн рд▓рд╛рддреЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рддрдХ рд╕реБрд░рдХреНрд╖рд┐рдд рдкрд╣реБрдВрдЪ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдЬрдЯрд┐рд▓ рдХрд╛рд░реНрдп рднреА рдХрд░рддреЗ рд╣реИрдВред
рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рд╕рд░рд▓ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ ZIO рдХреЗ рд╕рд╛рде рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рдкреНрд░рдгрд╛рд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд░реБрдХрд╛рд╡рдЯ рдХреБрдЫ рдФрд░ рд╣реИред рдХрдИ рдЕрдиреНрдп рдкреНрд░рднрд╛рд╡реЛрдВ рд╕реЗ рдирд┐рд░реНрдорд┐рдд рдПрдХ рдкреНрд░рднрд╛рд╡ рдХрд┐рд╕реА рднреА рд╕реАрдорд╛ рдкрд░ рдмрд╛рдзрд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рднрд╛рд╡ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
for { handle <- openFile(file) data <- readFile(handle) _ <- closeFile(handle) } yield data
рдЕрдзрд┐рдХрд╛рдВрд╢ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЗрд╕ рдкрд░рд┐рджреГрд╢реНрдп рдкрд░ рдЖрд╢реНрдЪрд░реНрдпрдЪрдХрд┐рдд рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ:
readFile
рдХреНрд░реИрд╢ рд╣реЛрдиреЗ рдкрд░
closeFile
рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдкреНрд░рднрд╛рд╡ рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рдПрдХ
ensuring
(рдХреИрдЯреНрд╕ рдЗрдлреЗрдХреНрдЯ рдореЗрдВ
guarantee
) рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдЕрдВрддрд┐рдо рд╣реИрдВрдбрд▓рд░ рдХреЛ рдЕрдВрддрд┐рдо рдкреНрд░рднрд╛рд╡ рдХреЗ рд╕рдорд╛рди рдЬреЛрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред
рддреЛ, рдКрдкрд░ рджрд┐рдП рдЧрдП рдХреЛрдб рдХреА рдореБрдЦреНрдп рд╕рдорд╕реНрдпрд╛ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
for { handle <- openFile(file) data <- readFile(handle).ensuring(closeFile(handle)) } yield ()
рдЕрдм рдпрд╣ рдкреНрд░рднрд╛рд╡ "рдЧрд┐рд░рд╛рд╡рдЯ рдкреНрд░рддрд┐рд░реЛрдзреА" рд╣реЛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕ рдЕрд░реНрде рдореЗрдВ рдХрд┐ рдпрджрд┐
readFile
рдЯреВрдЯ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдлрд╝рд╛рдЗрд▓ рдЕрднреА рднреА рдмрдВрдж рд╣реЛ рдЬрд╛рдПрдЧреАред рдФрд░ рдЕрдЧрд░
readFile
рд╕рдлрд▓ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдлрд╝рд╛рдЗрд▓ рднреА рдмрдВрдж рд╣реЛ рдЬрд╛рдПрдЧреАред рд╕рднреА рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдлрд╝рд╛рдЗрд▓ рдмрдВрдж рд╣реЛ рдЬрд╛рдПрдЧреАред
рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВред рд░реБрдХрд╛рд╡рдЯ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдкреНрд░рднрд╛рд╡ рдХреЛ рд╣рд░ рдЬрдЧрд╣ рдмрд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐
readFile
рдФрд░
readFile
рдмреАрдЪ рднреАред рдпрджрд┐ рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЦреБрд▓реА рдлрд╝рд╛рдЗрд▓ рдмрдВрдж рдирд╣реАрдВ рд╣реЛрдЧреА рдФрд░ рд╕рдВрд╕рд╛рдзрди рд░рд┐рд╕рд╛рд╡ рд╣реЛрдЧрд╛ред
рд╕рдВрд╕рд╛рдзрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдФрд░ рдЬрд╛рд░реА рдХрд░рдиреЗ рдХрд╛ рдкреИрдЯрд░реНрди рдЗрддрдирд╛ рд╡реНрдпрд╛рдкрдХ рд╣реИ рдХрд┐ ZIO рдиреЗ рдПрдХ рдмреНрд░реИрдХреЗрдЯ рдСрдкрд░реЗрдЯрд░ рдкреЗрд╢ рдХрд┐рдпрд╛, рдЬреЛ рдХрд┐ рдХреИрдЯреНрд╕ рдЗрдлреЗрдХреНрдЯ 1.0 рдореЗрдВ рднреА рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ред рдмреНрд░реИрдХреЗрдЯ рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рд░реБрдХрд╛рд╡рдЯреЛрдВ рд╕реЗ рдмрдЪрд╛рддрд╛ рд╣реИ: рдпрджрд┐ рд╕рдВрд╕рд╛рдзрди рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╕рдВрд╕рд╛рдзрди рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рдкреНрд░рднрд╛рд╡ рдмрд╛рдзрд┐рдд рд╣реЛрдиреЗ рдкрд░ рднреА рд░рд┐рд▓реАрдЬрд╝ рд╣реЛрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рди рддреЛ рд░рд╕реАрдж рдФрд░ рди рд╣реА рд╕рдВрд╕рд╛рдзрди рдХреА рд░рд┐рд╣рд╛рдИ рдХреЛ рдмрд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╕рдВрд╕рд╛рдзрди рд╕реБрд░рдХреНрд╖рд╛ рдХреА рдЧрд╛рд░рдВрдЯреА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
рдмреНрд░реИрдХреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдКрдкрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдЙрджрд╛рд╣рд░рдг рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
openFile(file).bracket(closeFile(_))(readFile(_))
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдмреНрд░реИрдХреЗрдЯ рдХреЗрд╡рд▓ рдПрдХ (рдХрд╛рдлреА рд╕рд╛рдорд╛рдиреНрдп) рд╕рдВрд╕рд╛рдзрди рдЦрдкрдд рдкреИрдЯрд░реНрди рдХреЛ рдПрдирдХреИрдкреНрд╕реБрд▓реЗрдЯ рдХрд░рддрд╛ рд╣реИред рдХрдИ рдЕрдиреНрдп рд╣реИрдВ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдкреНрдЯ рдХреЗ рд▓рд┐рдП рд╕реБрд▓рдн рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрдиреНрдпрдерд╛ рд▓реАрдХ рд╕рдВрднрд╡ рд╣реИред
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╕рднреА рд╡реНрдпрд╡рдзрд╛рди рдХрд╛рд░реНрдп рджреЛ рдореБрдЦреНрдп рдЪреАрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрддреЗ рд╣реИрдВ:
- рдХреБрдЫ рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рд░реБрдХрд╛рд╡рдЯ рдХреЛ рд░реЛрдХрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ;
- рдЙрди рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рд░реБрдХрд╛рд╡рдЯ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ рдЬреЛ рдЬрдо рд╕рдХрддреЗ рд╣реИрдВред
ZIO рдореЗрдВ рджреЛрдиреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдирд┐рдореНрди-рд╕реНрддрд░реАрдп ZIO рд╕рд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмреНрд░реИрдХреЗрдЯ рдХрд╛ рдЕрдкрдирд╛ рд╕рдВрд╕реНрдХрд░рдг рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
ZIO.uninterruptible { for { a <- acquire exit <- ZIO.interruptible(use(a)) .run.flatMap(exit => release(a, exit) .const(exit)) b <- ZIO.done(exit) } yield b }
рдЗрд╕ рдХреЛрдб рдореЗрдВ,
use(a)
рдПрдХрдорд╛рддреНрд░ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ рдЬрд┐рд╕реЗ рдмрд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЖрд╕рдкрд╛рд╕ рдХрд╛ рдХреЛрдб рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ
release
рдирд┐рд╖реНрдкрд╛рджрди рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрддрд╛ рд╣реИред
рдХрд┐рд╕реА рднреА рд╕рдордп, рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд░реБрдХрд╛рд╡рдЯреЛрдВ рдХрд╛ рдЕрд╡рд╕рд░ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП, рдХреЗрд╡рд▓ рджреЛ рдЖрджрд┐рдо рд╕рдВрдЪрд╛рд▓рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ (рд╢реЗрд╖ рд╕рднреА рдЙрдирд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВ)ред
рдпрд╣ рд╕рдВрд░рдЪрдирд╛ рдкреВрд░реНрдг-рдкреВрд░реНрдг рдЗрдВрдЯрд░рдкреНрдЯ рдореЙрдбрд▓ рдЖрдкрдХреЛ рди рдХреЗрд╡рд▓ рдПрдХ рд╕рд░рд▓ рдмреНрд░реИрдХреЗрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рд╕рдВрд╕рд╛рдзрди рдкреНрд░рдмрдВрдзрди рдореЗрдВ рдЕрдиреНрдп рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдХреЛ рднреА рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЗрдВрдЯрд░рдкреНрдЯ рдХреЗ рдлрд╛рдпрджреЗ рдФрд░ рдиреБрдХрд╕рд╛рди рдХреЗ рдмреАрдЪ рдПрдХ рд╕рдВрддреБрд▓рди рдкрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдХреИрдЯреНрд╕ рдЖрдИрдУ рдЗрдВрдЯрд░рдкреНрдЯ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рдСрдкрд░реЗрд╢рди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ: рдЕрдЪреЗрддрди рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ред рдпрд╣ рдХреЛрдб рдХреЗ рдкреВрд░реЗ рдмреНрд▓реЙрдХ рдХреЛ рдирд┐рд░реНрдмрд╛рдз рдмрдирд╛рддрд╛ рд╣реИред рдпрджреНрдпрдкрд┐ рдЗрд╕ рдСрдкрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рд╢рд╛рдпрдж рд╣реА рдХрднреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рд╕рдВрд╕рд╛рдзрди рд░рд┐рд╕рд╛рд╡ рдпрд╛ рддрд╛рд▓реЗ рдХреЛ рдЬрдиреНрдо рджреЗ рд╕рдХрддрд╛ рд╣реИред
рдЗрд╕реА рд╕рдордп, рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдЖрдк рдХреИрдЯреНрд╕ рдЖрдИрдУ рдХреЗ рдЕрдВрджрд░ рдПрдХ рдЖрджрд┐рдо рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдЖрдкрдХреЛ рдЗрдВрдЯрд░рдкреНрдЯ рдкрд░ рдЕрдзрд┐рдХ рдирд┐рдпрдВрддреНрд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдлреИрдмрд┐рдпреЛ рд▓рд╛рдмреЗрд▓рд╛ рдХрд╛ рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмреЗрд╣рдж рдзреАрдорд╛ рдирд┐рдХрд▓рд╛ред
ZIO рдЖрдкрдХреЛ рд░реБрдХрд╛рд╡рдЯреЛрдВ рдХреЗ рд╕рд╛рде рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдШреЛрд╖рдгрд╛рддреНрдордХ рдпреМрдЧрд┐рдХ рдХрдердиреЛрдВ рдХреЗ рд╕рд╛рде рдЙрдЪреНрдЪ рд╕реНрддрд░ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдЖрдкрдХреЛ рдХрдо рдкреНрд░рджрд░реНрд╢рди рдФрд░ рдЕрд╡рд░реБрджреНрдз рд▓реАрдХ рдХреЗ рд╕рд╛рде рд╕рдВрдпреБрдХреНрдд рдЧрдВрднреАрд░ рдЬрдЯрд┐рд▓рддрд╛ рдХреЗ рдмреАрдЪ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, ZIO рдореЗрдВ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдЯреНрд░рд╛рдВрдЬреИрдХреНрд╢рдирд▓ рдореЗрдореЛрд░реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдФрд░ рдХреЛрдб рдХреЛ рдШреЛрд╖рд┐рдд рд░реВрдк рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ, рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рд╣реИрдВ рдФрд░ рд╡реНрдпрд╡рдзрд╛рди рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред
3. рдЧрд╛рд░рдВрдЯреА рдлрд╛рдЗрдирд▓
рдХрдИ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдХреЛрд╢рд┐рд╢ / рдЕрдВрдд рдореЗрдВ рдмреНрд▓реЙрдХ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рд▓реАрдХ рдХрд┐рдП рдмрд┐рдирд╛ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдЧрд╛рд░рдВрдЯреА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдпрд╣ рдмреНрд▓реЙрдХ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрддрд╛ рд╣реИ: рдпрджрд┐ рдХреЛрдИ рдЯреНрд░рд╛рдпрд▓ рдмреНрд▓реЙрдХ рдирд┐рд╖реНрдкрд╛рджрди рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЕрдВрдд рдореЗрдВ рдмреНрд▓реЙрдХ рд╕реНрдЯреЙрдк рд╣реЛрдиреЗ рдкрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдЧрд╛ред
рдпрд╣ рд╡рд╛рд░рдВрдЯреА рдЗрд╕ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддреА рд╣реИ:
- рдиреЗрд╕реНрдЯреЗрдб рд╣реИрдВ "рдХреЛрд╢рд┐рд╢ / рдЕрдВрдд рдореЗрдВ" рдмреНрд▓реЙрдХ;
- "рдХреЛрд╢рд┐рд╢ рдмреНрд▓реЙрдХ" рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реИрдВ;
- рдиреЗрд╕реНрдЯреЗрдб рдЕрдВрддрддрдГ рдмреНрд▓реЙрдХ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдБ рд╣реИрдВред
ZIO "рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛" рдСрдкрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рдХреЛрд╢рд┐рд╢ / рдЕрдВрдд рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
val effect2 = effect.ensuring(cleanup)
ZIO "effect.ensuring (рдлрд╛рдЗрдирд▓)" рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЧрд╛рд░рдВрдЯреА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ: рдпрджрд┐ "рдкреНрд░рднрд╛рд╡" рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛрдирд╛ рд╢реБрд░реВ рд╣реБрдЖ, рддреЛ "рдкреНрд░рднрд╛рд╡" рдмрдВрдж рд╣реЛрдиреЗ рдкрд░ "рдЕрдВрддрд┐рдо" рдирд┐рд╖реНрдкрд╛рджрди рд╢реБрд░реВ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред
рдЬреИрд╕реЗ рдкреНрд░рдпрд╛рд╕ / рдЕрдВрдд рдореЗрдВ, рдпреЗ рдЧрд╛рд░рдВрдЯреА рдирд┐рдореНрди рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд░рд╣рддреА рд╣реИрдВ:
- рд░рдЪрдирд╛рдПрдВ "рд╕реБрдирд┐рд╢реНрдЪрд┐рдд" рд╣реИрдВ;
- "рдкреНрд░рднрд╛рд╡" рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реИрдВ;
- рдиреЗрд╕реНрдЯреЗрдб "рдлрд╛рдЗрдирд▓" рдореЗрдВ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реИрдВред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЧрд╛рд░рдВрдЯреА рдХреЛ рдмрдирд╛рдП рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ рднрд▓реЗ рд╣реА рдкреНрд░рднрд╛рд╡ рдмрд╛рдзрд┐рдд рд╣реЛ ("рдмреНрд░реИрдХреЗрдЯ рдкрд░ рдЧрд╛рд░рдВрдЯреА" рд╕рдорд╛рди рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, "рдмреНрд░реИрдХреЗрдЯ" "рд╕реБрдирд┐рд╢реНрдЪрд┐рдд" рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред
рдХреИрдЯ IO рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдПрдХ рдФрд░, рдХрдордЬреЛрд░ рдЧрд╛рд░рдВрдЯреА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред "Effect.guarantee (рдлрд╛рдЗрдирд▓рд┐рдЬрд╝рд░)" рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ рдирд┐рдореНрди рдкреНрд░рдХрд╛рд░ рд╕реЗ рдХрдордЬреЛрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рдпрджрд┐ "рдкреНрд░рднрд╛рд╡" рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд▓рдЧрд╛, рддреЛ "рдЕрдВрддрд┐рдо" рддрдм рдирд┐рд╖реНрдкрд╛рджрди рд╢реБрд░реВ рдХрд░реЗрдЧрд╛ рдЬрдм "рдкреНрд░рднрд╛рд╡" рдмрдВрдж рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдпрджрд┐ рд╕рдорд╕реНрдпрд╛ рдкреНрд░рднрд╛рд╡ "рдкреНрд░рднрд╛рд╡" рдореЗрдВ рдирд╣реАрдВ рдбрд╛рд▓реА рдЬрд╛рддреА рд╣реИред
рдмрд┐рд▓реНрд▓рд┐рдпреЛрдВ IO рдореЗрдВ "рдмреНрд░реИрдХреЗрдЯ" рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдПрдХ рдХрдордЬреЛрд░ рдЧрд╛рд░рдВрдЯреА рднреА рдкрд╛рдИ рдЬрд╛рддреА рд╣реИред
рд╕рдВрд╕рд╛рдзрди рд░рд┐рд╕рд╛рд╡ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, "рдЧрд╛рд░рдВрдЯреА" рдпрд╛ "рдмреНрд░реИрдХреЗрдЯ.рдпреВрдЬрд╝" рдкреНрд░рднрд╛рд╡ рдХреЗ рдЕрдВрджрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рднрд╛рд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд▓рд┐рдЦреЗрдВ:
рдЬрдм рдмрд┐рдЧрдЯреЙрд░рдмрд▓ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рджреВрд╕рд░реЗ рдкреНрд░рднрд╛рд╡ рдореЗрдВ рдбрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдкреНрд░рднрд╛рд╡ рдирд┐рд░реНрдмрд╛рдз рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ - "рдЧрд╛рд░рдВрдЯреА" рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реЗрдЯ рдХреЛрдИ "рдлрд╛рдЗрдирд▓", рдпрд╛ "рдмреНрд░реИрдХреЗрдЯ" рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рд╕рдлрд╛рдИ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХреА рдЬрд╛рдПрдЧреАред рдпрд╣ рд╕рдм рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рдПрдХ рдирд╛рд▓реА рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ, рддрдм рднреА рдЬрдм рдмреНрд▓реЙрдХ рдореЗрдВ "рдлрд╛рдЗрдирд▓" рд╣реЛрддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдореЗрдВ "рдлрд╛рдЗрдирд▓" рдХрднреА рднреА рдирд┐рд╖реНрдкрд╛рджрди рд╢реБрд░реВ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛:
(IO.unit >> bigTrouble).guarantee(IO(println("Won't be executed!!!┬л)))
рдЬрдм рд╡реИрд╢реНрд╡рд┐рдХ рд╕рдВрджрд░реНрдн рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦреЗ рдмрд┐рдирд╛ рдХреЛрдб рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ рдХрд┐ "рдмреНрд░реИрдХреЗрдЯ" рдСрдкрд░реЗрд╢рди рдХреЗ "рдЙрдкрдпреЛрдЧ" рдкреНрд░рднрд╛рд╡ рдореЗрдВ рдХрд╣реАрдВ рднреА рдбрд╛рд▓рд╛ рдЬрд╛рдПрдЧрд╛ рдпрд╛ "рдлрд╛рдЗрдирд▓" рдмреНрд▓реЙрдХ рдХреЗ рдЕрдВрджрд░ред
рдЗрд╕рд▓рд┐рдП, рдЖрдк рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ рдХрд┐ рдкреВрд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд┐рдП рдмрд┐рдирд╛ рдХреИрдЯ рдЖрдИрдУ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕рдВрд╕рд╛рдзрди рд▓реАрдХ рдпрд╛ рд▓рд╛рдкрддрд╛ "рдлрд╛рдЗрдирд▓" рдмреНрд▓реЙрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдЧрд╛ рдпрд╛ рдирд╣реАрдВред рдкреВрд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдХреЗрд╡рд▓ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣рдореЗрд╢рд╛ рдЙрди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╣реЛрддреА рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдХрдВрдкрд╛рдЗрд▓рд░ рджреНрд╡рд╛рд░рд╛ рд╕рддреНрдпрд╛рдкрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╣рд░ рдмрд╛рд░ рдХреЛрдб рдореЗрдВ рдХреЛрдИ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрдиреЗ рдкрд░ рджреЛрд╣рд░рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
ZIO рдореЗрдВ рдХреИрдЯреНрд╕ рдЗрдлрд╝реЗрдХреНрдЯ, "рдЧрд╛рд░рдВрдЯреА рдХреИрд╕" рдФрд░ "рдмреНрд░реИрдХреЗрдЯ" рд╕реЗ "рдЧрд╛рд░рдВрдЯреА" рдХрд╛ рдХрд╕реНрдЯрдо рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдореВрд▓ ZIO рд╢рдмреНрджрд╛рд░реНрде (рди рдХрд┐ рдХреИрдЯ IO рд╢рдмреНрджрд╛рд░реНрде) рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рд╣рдореЗрдВ рд╕рдВрд╕рд╛рдзрди рд▓реАрдХ рдХреЗ рд╕рд╛рде рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдпрд╣рд╛рдВ рдФрд░ рдЕрдм, рдпрд╣ рдЬрд╛рдирддреЗ рд╣реБрдП рдХрд┐ рд╕рднреА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдЕрдВрддрд┐рдо рд░реВрдк рд╕реЗ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдореБрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
4. рд╕реНрдерд┐рд░ рд╕реНрд╡рд┐рдЪрд┐рдВрдЧ
рдХреИрдЯреНрд╕ рдЗрдлрд╝реЗрдХреНрдЯ рдореЗрдВ "рдХреЙрдиреНрдЯреЗрдХреНрд╕реНрдЯрд╢рд┐рдлреНрдЯ" рд╕реЗ "рдЗрд╡реИрд▓реЛрди" рд╡рд┐рдзрд┐ рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рдХреБрдЫ рдХреЛрдб рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рджреВрд╕рд░реЗ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдВрджрд░реНрдн рдореЗрдВ рд▓реЗ рдЬрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред
рдпрд╣ рдХрдИ рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдЙрдкрдпреЛрдЧреА рд╣реИ:
- рдХрдИ рдХреНрд▓рд╛рдЗрдВрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдереНрд░реЗрдб рдкреВрд▓ рдореЗрдВ рдХреБрдЫ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддреА рд╣реИрдВ;
- рдпреВрдЖрдИ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдпреВрдЖрдИ рдереНрд░реЗрдб рдореЗрдВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдХреБрдЫ рдЕрдкрдбреЗрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ;
- рдХреБрдЫ рдкреНрд░рднрд╛рд╡реЛрдВ рдХреЛ рдЙрдирдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдЕрдиреБрдХреВрд▓ рдереНрд░реЗрдб рдкреВрд▓ рдкрд░ рдЕрд▓рдЧрд╛рд╡ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
"рдПрд╡рд▓реЙрди" рдСрдкрд░реЗрд╢рди рдЙрд╕ рдкреНрд░рднрд╛рд╡ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдЗрд╕реЗ рдЪрд▓рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдлрд┐рд░ рдореВрд▓ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдВрджрд░реНрдн рдкрд░ рд▓реМрдЯрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
cs.evalOn(kafkaContext)(kafkaEffect)
рдиреЛрдЯ: рдХреИрдЯ IO рдореЗрдВ рдПрдХ рд╕рдорд╛рди "рд╢рд┐рдлреНрдЯ" рдирд┐рд░реНрдорд╛рдг рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рд╡рд╛рдкрд╕ рдЬрд╛рдиреЗ рдХреЗ рдмрд┐рдирд╛ рдПрдХ рдЕрд▓рдЧ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рд╢рд╛рдпрдж рд╣реА рдХрднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП "evalOn" рдХреЛ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рджреА рдЬрд╛рддреА рд╣реИред
"EvalOn" рдХрд╛ ZIO рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди (ZIO рдЖрджрд┐рдо "рд▓реЙрдХ" рдкрд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛) рд╡рд┐рд╢рд┐рд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдЧрд╛рд░рдВрдЯреА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рднрд╛рд╡ рдХрд╣рд╛рдБ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ - рдкреНрд░рднрд╛рд╡ рд╣рдореЗрд╢рд╛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрджрд░реНрдн рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдХреИрдЯреНрд╕ IO рдХреА рдПрдХ рдЕрд▓рдЧ, рдХрдордЬреЛрд░ рдЧрд╛рд░рдВрдЯреА рд╣реИ - рдкреНрд░рднрд╛рд╡ рдХреЛ рдкрд╣рд▓реЗ рдЕрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдСрдкрд░реЗрд╢рди рдпрд╛ рдЖрдВрддрд░рд┐рдХ рд╕реНрд╡рд┐рдЪрд┐рдВрдЧ рддрдХ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрджрд░реНрдн рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рдХреЛрдб рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП, рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдкреНрд░рднрд╛рд╡ (рдпрд╛ рдиреЗрд╕реНрдЯреЗрдб рд╕реНрд╡рд┐рдЪрд┐рдВрдЧ) рдЙрд╕ рдкреНрд░рднрд╛рд╡ рдореЗрдВ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬреЛ рд╕реНрд╡рд┐рдЪ рдХрд░реЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред
рдЗрд╕рд▓рд┐рдП, рд╕рдВрд╕рд╛рдзрди рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреИрдЯреНрд╕ рдЖрдИрдУ рдкреНрд░рднрд╛рд╡ рдХрд╣рд╛рдБ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдкреВрд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдФрд░ рдореЗрд░реЗ рдЕрдиреБрднрд╡ рд╕реЗ, рдХреИрдЯреНрд╕ рдЖрдИрдУ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЖрд╢реНрдЪрд░реНрдп рд╣реЛрддрд╛ рд╣реИ, рдЬрдм рдПрдХ рд╕рдВрджрд░реНрдн рдореЗрдВ "evalOn" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдпрд╣ рдмрд╛рдж рдореЗрдВ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреНрд░рднрд╛рд╡ рдЧрд▓рддреА рд╕реЗ рджреВрд╕рд░реЗ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
ZIO рдЖрдкрдХреЛ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рднрд╛рд╡реЛрдВ рдХреЛ рдХрд╣рд╛рдВ рдЯреНрд░рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдХрд░реЗрдВ рдХрд┐ рдпрд╣ рд╕рднреА рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╣реЛрдЧрд╛, рдЪрд╛рд╣реЗ рдкреНрд░рднрд╛рд╡ рдЕрдиреНрдп рдкреНрд░рднрд╛рд╡реЛрдВ рдореЗрдВ рдХреИрд╕реЗ рдмрдирд╛ рд╣реЛред
5. рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢реЛрдВ рдХреА рд╕реБрд░рдХреНрд╖рд╛
рдХреЛрдИ рднреА рдкреНрд░рднрд╛рд╡ рдЬреЛ рд╕рдВрд╕рд╛рдзрди, рд╕рдВрдЧрд╛рдорд┐рддрд┐, рдпрд╛ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рддрдХ рд╕реБрд░рдХреНрд╖рд┐рдд рдкрд╣реБрдБрдЪ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдПрдХ рд░реИрдЦрд┐рдХ рддреНрд░реБрдЯрд┐ рдореЙрдбрд▓ рдореЗрдВ рдЪрд▓реЗрдЧрд╛: рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╕рднреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдирд╣реАрдВ рдмрдЪрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдпрд╣ рджреЛрдиреЛрдВ `рдереНрд░реЛрдПрдмрд▓` рдХреЗ рд▓рд┐рдП рд╕рд╣реА рд╣реИ, рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░ рдЬреЛ рдХрд┐ рдХреИрдЯреНрд╕ рдЖрдИрдУ рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдкреЙрд▓реАрдУрд░реНрдлрд┐рдХ рддреНрд░реБрдЯрд┐ рдкреНрд░рдХрд╛рд░ рдЬреЛ рдХрд┐ рдЬрд┐рдУ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рд╣реИред
рдХрдИ рдПрдХ рд╕рдордп рдХреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдг:
- рдлрд╛рдЗрдирд▓ рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХрддрд╛ рд╣реИ;
- рджреЛ (рдЧрд┐рд░рдиреЗ) рдкреНрд░рднрд╛рд╡ рд╕рдорд╛рдирд╛рдВрддрд░ рдирд┐рд╖реНрдкрд╛рджрди рдореЗрдВ рд╕рдВрдпреБрдХреНрдд рд╣реЛрддреЗ рд╣реИрдВ;
- рд░реЗрд╕рд┐рдВрдЧ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рджреЛ (рдЧрд┐рд░рдиреЗ) рдкреНрд░рднрд╛рд╡;
- рд░реБрдХрд╛рд╡рдЯ рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рдЕрдиреБрднрд╛рдЧ рдЫреЛрдбрд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдмрд╛рдзрд┐рдд рдкреНрд░рднрд╛рд╡ рдЧрд┐рд░рддрд╛ рд╣реИред
рдЪреВрдВрдХрд┐ рд╕рднреА рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╕рд╣реЗрдЬреЗ рдирд╣реАрдВ рдЬрд╛рддреЗ рд╣реИрдВ, ZIO рдПрдХ рдирд┐: рд╢реБрд▓реНрдХ рд╕реЗрдорд┐рдирд╛рд░ (рдЕрдореВрд░реНрдд рдмреАрдЬрдЧрдгрд┐рдд рд╕реЗ рдПрдХ рдЕрдореВрд░реНрдд, рдЗрд╕рдХрд╛ рдЬреНрдЮрд╛рди рдпрд╣рд╛рдВ рдирд╣реАрдВ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ) рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдПрдХ "рдХрд╛рд░рдг [рдИ]" рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐ рдХреЗ рд▓рд┐рдП рдзрд╛рд░рд╛рд╡рд╛рд╣рд┐рдХ рдФрд░ рд╕рдорд╛рдирд╛рдВрддрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╕рднреА рдкрд░рд┐рдЪрд╛рд▓рдиреЛрдВ рдХреЗ рджреМрд░рд╛рди (рдПрдХ рдЧрд┐рд░ рдпрд╛ рдмрд╛рдзрд┐рдд рдкреНрд░рднрд╛рд╡ рдХреЗ рд▓рд┐рдП рд╕рдлрд╛рдИ рд╕рд╣рд┐рдд), ZIO рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ "рдХрд╛рд░рдг [E]" рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдПрдХрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХрд┐рд╕реА рднреА рд╕рдордп рдЙрдкрд▓рдмреНрдз рд╣реИред рдирддреАрдЬрддрди, ZIO рд╣рдореЗрд╢рд╛ рд╕рднреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ: рд╡реЗ рд╣рдореЗрд╢рд╛ рдЙрдкрд▓рдмреНрдз рд╣реЛрддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд▓реЙрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЕрдзреНрдпрдпрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд░реВрдкрд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдХреИрдЯ IO рдиреЗ рддреНрд░реБрдЯрд┐ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рдиреБрдХрд╕рд╛рди рдХреЗ рд╕рд╛рде рдПрдХ рдореЙрдбрд▓ рдЪреБрдирд╛ред рдЬрдмрдХрд┐ ZIO рдХреЙрдЬрд╝ [E] рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рджреЛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдЧрд╛, рдХреИрдЯреНрд╕ IO рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ "рдЦреЛ" рджреЗрдЧрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, "e.printStackTrace ()" рдЬреЛ рддреНрд░реБрдЯрд┐ рд╣реЛрддреА рд╣реИ рдкрд░ рдХреЙрд▓ рдХрд░рдХреЗред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдХреЛрдб рдореЗрдВ "рдлрд╛рдЗрдирд▓" рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рдЦреЛ рдЬрд╛рдПрдЧреАред
IO.raiseError(new Error("Error 1")).guarantee(IO.raiseError(new Error("Error 2┬л)))
рдЯреНрд░реИрдХрд┐рдВрдЧ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЖрдк рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдкреВрд░реЗ рд╕реНрдкреЗрдХреНрдЯреНрд░рдо рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдкреНрд░рднрд╛рд╡реЛрдВ рдХреЗ рд╕рдВрдпреЛрдЬрди рдХреЗ рдХрд╛рд░рдг рд╣реЛрддрд╛ рд╣реИред ZIO рдЖрдкрдХреЛ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ "рдереНрд░реЛрдПрдмрд▓" (рдпрд╛ "IOExceptio" рдпрд╛ рдПрдХ рдЕрдиреНрдп рдХрд╕реНрдЯрдо рдЕрдкрд╡рд╛рдж рдкрджрд╛рдиреБрдХреНрд░рдо рдЬреИрд╕реЗ рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрдкрдкреНрд░рдХрд╛рд░) рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддреЗ рд╣реБрдП рдХрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рджреМрд░рд╛рди рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реБрдИ рд╣реИред
6. рдЧрддрд┐рд░реЛрдз рдХреЗ рдмрд┐рдирд╛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ
ZIO рдФрд░ Cats IO рджреЛрдиреЛрдВ рдПрдХ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЛ рдХреЙрд▓рдмреИрдХ рдХреЗ рд╕рд╛рде рдХреЛрдб рд▓реЗрдиреЗ рдФрд░ рдЗрд╕реЗ рдкреНрд░рднрд╛рд╡реА рд░реВрдк рд╕реЗ рд▓рдкреЗрдЯрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ
рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдмрд┐рд▓реНрд▓рд┐рдпреЛрдВ рдХреЗ рдкреНрд░рднрд╛рд╡ рдореЗрдВ Async рдкрд╛рдЗрдк рд╡рд░реНрдЧ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рджрд╛рди рдХреА рдЬрд╛рддреА рд╣реИ:
val effect: Task[Data] = Async[Task].async(k => getDataWithCallbacks( onSuccess = v => k(Right(v)), onFailure = e => k(Left(e)) ))
рдпрд╣ рдПрдХ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░рднрд╛рд╡ рдмрдирд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╕рдордп, рдореВрд▓реНрдп рдкреНрд░рдХрдЯ рд╣реЛрдиреЗ рддрдХ рдЗрдВрддрдЬрд╛рд░ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдлрд┐рд░ рдЬрд╛рд░реА рд░рдЦреЗрдВрдЧреЗ, рдФрд░ рдпрд╣ рд╕рдм рдкреНрд░рднрд╛рд╡ рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рд╣реЛрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЛрдб рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдмрд╣реБрдд рдЖрдХрд░реНрд╖рдХ рд╣реИред
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЬреИрд╕реЗ рд╣реА рдХреЙрд▓рдмреИрдХ рдХреЛрдб рдПрдХ рдкреНрд░рднрд╛рд╡ рдореЗрдВ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИ, рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди (рдпрд╣рд╛рдВ рдЗрд╕реЗ `k` рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ) рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рд╕рдлрд▓рддрд╛ / рддреНрд░реБрдЯрд┐ рдорд╛рди рдХреЗ рд╕рд╛рде рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддрд╛ рд╣реИред рдЬрдм рдпрд╣ рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдкреНрд░рднрд╛рд╡ рдХрд╛ рдирд┐рд╖реНрдкрд╛рджрди (рдкрд╣рд▓реЗ рд░реЛрдХрд╛ рдЧрдпрд╛) рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред
ZIO рдЧрд╛рд░рдВрдЯреА рджреЗрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рднрд╛рд╡ рд░рдирдЯрд╛рдЗрдо рдереНрд░реЗрдб рдкреВрд▓ рдкрд░ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдЧрд╛ рдпрджрд┐ рдкреНрд░рднрд╛рд╡ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рд╡рд┐рд╢реЗрд╖ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдпрд╛ рдкреНрд░рднрд╛рд╡ рдХреЛ рд╕рдВрд▓рдЧреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдЕрдиреНрдп рд╕рдВрджрд░реНрдн рдХреЛ рдирд╣реАрдВ рд╕реМрдВрдкрд╛ рдЧрдпрд╛ рдерд╛ред
Cats IO рдХреЙрд▓рдмреИрдХ рдереНрд░реЗрдб рдкрд░ рдкреНрд░рднрд╛рд╡ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИред рдЗрди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рдмреАрдЪ рдХрд╛ рдЕрдВрддрд░ рдХрд╛рдлреА рдЧрд╣рд░рд╛ рд╣реИ: рдХреЙрд▓рдмреИрдХ рдХреЗ рдХрд╛рд░рдг рдереНрд░реЗрдб рдХреЙрд▓рдмреИрдХ рдХреЛрдб рдХреЛ рд╣рдореЗрд╢рд╛ рдХреЗ рд▓рд┐рдП рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдирд┐рдпрдВрддреНрд░рдг рд░рд┐рдЯрд░реНрди рд╕реЗ рдкрд╣рд▓реЗ рдереЛрдбрд╝реА рджреЗрд░реА рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рджреВрд╕рд░реА рдУрд░, рдХреИрдЯреНрд╕ рдЖрдИрдУ рдЗрд╕ рддрд░рд╣ рдХреА рдЧрд╛рд░рдВрдЯреА рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ: рдХреЙрд▓рд┐рдВрдЧ рдереНрд░реЗрдб, рд▓реЙрдиреНрдЪрд┐рдВрдЧ рдХреЙрд▓рдмреИрдХ, рдлреНрд░реАрдЬ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЕрдирд┐рд╢реНрдЪрд┐рдд рд╕рдордп рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рдирд┐рд╖реНрдкрд╛рджрди рдирд┐рдпрдВрддреНрд░рдг рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддрд╛ рд╣реИред
рдмрд┐рд▓реНрд▓рд┐рдпреЛрдВ рдХреЗ рдкреНрд░рднрд╛рд╡ ("рд╕реНрдердЧрд┐рдд", "рд╕реЗрдордлреЛрд░") рдореЗрдВ рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рдкрд╣рд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рд╣реБрдП рдкреНрд░рднрд╛рд╡ рдЬреЛ рдХреЙрд▓рд┐рдВрдЧ рдереНрд░реЗрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рдирд┐рдпрдВрддреНрд░рдг рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдирддреАрдЬрддрди, рдЧрддрд┐рд░реЛрдз рдФрд░ рдПрдХ рдЯреВрдЯреЗ рд╣реБрдП рдирд┐рд╖реНрдкрд╛рджрди рдЕрдиреБрд╕реВрдЪрдХ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреА рдЦреЛрдЬ рдХреА рдЧрдИ рдереАред рдпрджреНрдпрдкрд┐ рдпреЗ рд╕рднреА рд╕рдорд╕реНрдпрд╛рдПрдВ рдкрд╛рдИ рдЧрдИ рд╣реИрдВ, рд╡реЗ рдХреЗрд╡рд▓ рдХреИрдЯреНрд╕ рдЗрдлреЗрдХреНрдЯ рдореЗрдВ рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рддрдп рдХреА рдЧрдИ рд╣реИрдВред
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛрдб рдЬреЛ рдХреИрдЯ рдЖрдИрдУ рдХреЗ рд╕рдорд╛рди рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рд╡рд╣ рдЗрд╕ рддрд░рд╣ рдХреА рдкрд░реЗрд╢рд╛рдирд┐рдпреЛрдВ рдореЗрдВ рдкрдбрд╝ рдЬрд╛рдПрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрд╛рд░реНрдп рдЧреИрд░-рдирд┐рдпрддрд╛рддреНрдордХ рд╣реИрдВ, рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗрд╡рд▓ рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдмрд╣реБрдд рдХрдо рд╣реА рд╣реЛ рд╕рдХрддреА рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдбрд┐рдмрдЧрд┐рдВрдЧ рдФрд░ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдПрдХ рдХрдард┐рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИред
ZIO рдбреЗрдбрд▓реЙрдХ рд╕реБрд░рдХреНрд╖рд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдп рд╢реЗрдбреНрдпреВрд▓рд░ рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддрд╛ рд╣реИ, рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХреИрдЯреНрд╕ IO рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рднреА рдЪрдпрди рдХрд░рддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, "рдкреНрд░реЙрдорд┐рд╕" рдкрд░ "рдЕрд╕реБрд░рдХреНрд╖рд┐рдд" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЬреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рд╣реБрдП рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░рднрд╛рд╡ рдореЗрдВ рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ)ред
рдпрджреНрдпрдкрд┐ рдХреЛрдИ рднреА рд╕рдорд╛рдзрд╛рди рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рднреА рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИ, рдФрд░ ZIO рдФрд░ Cats IO рд╕рднреА рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ (рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЛрдВ рд╕реЗ) рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд▓рдЪреАрд▓рд╛рдкрди рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ, ZIO рдХрд╛ рдорддрд▓рдм рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЪрд┐рдВрддрд╛ рдХреЗ "Async" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рд╕рдорд╕реНрдпрд╛ рдХреЛрдб рдХреЛ "рдЕрд╕реБрд░рдХреНрд╖рд┐рдд" рдореЗрдВ рдбрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЧрддрд┐рд░реЛрдз рдкреИрджрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ
7. рднрд╡рд┐рд╖реНрдп рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд
рд╕реНрдХрд╛рд▓рд╛ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗ "рдлреНрдпреВрдЪрд░" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдХреЛрдб рдмреЗрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рд╣реИред ZIO рдПрдХ "FromFuture" рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рдЖрддрд╛ рд╣реИ, рдЬреЛ рдПрдХ рддреИрдпрд╛рд░ рдирд┐рд╖реНрдкрд╛рджрди рдирд┐рд╖реНрдкрд╛рджрди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ:
ZIO.fromFuture(implicit ec =>
рдЬрдм рдЗрд╕ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ Future рдХреЛ рдПрдХ рдкреНрд░рднрд╛рд╡ рдореЗрдВ рд▓рдкреЗрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ ZIO рд╕реЗрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ Future рдХреЛ рдХрд╣рд╛рдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдЕрдиреНрдп рд╡рд┐рдзрд┐рдпрд╛рдВ, рдЬреИрд╕реЗ рдХрд┐ evalOn, рднрд╡рд┐рд╖реНрдп рдХреЛ рд╡рд╛рдВрдЫрд┐рдд рдирд┐рд╖реНрдкрд╛рджрди рд╕рдВрджрд░реНрдн рдореЗрдВ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджреЗрдЧрд╛ред рдХреИрдЯреНрд╕ IO "рдлреНрдпреВрдЪрд░" рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдПрдХ рдмрд╛рд╣рд░реА "рдПрдХреНрдЬрд┐рдХреНрдпреВрд╢рдирдХреЛрдЯреЗрдХреНрд╕реНрдЯ" рдХреЗ рд╕рд╛рде рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдХреИрдЯреНрд╕ IO рдЗрд╡реЗрд▓реЙрди рдпрд╛ рд╢рд┐рдлреНрдЯ рдХреЗ рддрд░реАрдХреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдлреНрдпреВрдЪрд░ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдЖрдЧреЗ рдирд╣реАрдВ рдмрдврд╝рд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рднрд╡рд┐рд╖реНрдп рдХреЗ рд▓рд┐рдП рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд╕рдВрджрд░реНрдн рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд░ рдмреЛрдЭ рдбрд╛рд▓рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рд╕рдВрдХреАрд░реНрдг рдЪрдпрди рдФрд░ рдПрдХ рдЕрд▓рдЧ рд╡рд╛рддрд╛рд╡рд░рдгред
рдЪреВрдВрдХрд┐ рдкреНрд░рджрддреНрдд рдПрдХреНрдЬрд╝реАрдХреНрдпреВрд╢рди рдХреЛрдЯреЗрдХреНрд╕реНрдЯ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, ZIO рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЗ рдореЗрдВ рдлреНрдпреВрдЪрд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╕реНрдореВрде рдФрд░ рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрддреЗ рд╣реБрдП рдХреИрдЯреНрд╕ IO рдлреАрдЪрд░реНрд╕ рдХреЗ рдпреЛрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрднреА рднреА рдХреБрдЫ рдЕрдкрд╡рд╛рдж рд╣реИрдВред
8. рдмреНрд▓реЙрдХрд┐рдВрдЧ рдЖрдИрдУ
рдЬреИрд╕рд╛ рдХрд┐ рд▓реЗрдЦ "
рдереНрд░реЗрдб рдкреВрд▓ " рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛
ред ZIO рдХреЗ рд╕рд╛рде рд╕рд░реНрд╡реЛрддреНрддрдо рдЕрднреНрдпрд╛рд╕ тАЭ, рд╕рд░реНрд╡рд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП, рдЕрдзрд┐рдХрддрдо рджрдХреНрд╖рддрд╛ рдХреЗ рд▓рд┐рдП рдХрдо рд╕реЗ рдХрдо рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреВрд▓реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ:
- рд╕реАрдкреАрдпреВ / рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░рднрд╛рд╡ рдХреЗ рд▓рд┐рдП рдирд┐рд╢реНрдЪрд┐рдд рдкреВрд▓;
- рдЧрддрд┐рд╢реАрд▓, рдЕрд╡рд░реБрджреНрдз рдзрд╛рдЧреЗ рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╡реГрджреНрдзрд┐ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЗ рд╕рд╛рдеред
рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдереНрд░реЗрдб рдкреВрд▓ рдкрд░ рд╕рднреА рдкреНрд░рднрд╛рд╡реЛрдВ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рдирд┐рд░реНрдгрдп рд╕реЗ рдПрдХ рджрд┐рди рдЧрддрд┐рд░реЛрдз рдкреИрджрд╛ рд╣реЛрдЧрд╛, рдЬрдмрдХрд┐ рдЧрддрд┐рд╢реАрд▓ рдкреВрд▓ рдкрд░ рд╕рднреА рдкреНрд░рднрд╛рд╡реЛрдВ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рдиреЗ рд╕реЗ рдкреНрд░рджрд░реНрд╢рди рд╣рд╛рдирд┐ рд╣реЛ рд╕рдХрддреА рд╣реИред
JVM рдкрд░, ZIO рджреЛ рдСрдкрд░реЗрд╢рди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЕрд╡рд░реЛрдзрдХ рдкреНрд░рднрд╛рд╡реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ:
- "рдмреНрд▓реЙрдХрд┐рдВрдЧ (рдкреНрд░рднрд╛рд╡") рдСрдкрд░реЗрдЯрд░, рдЬреЛ рдмреНрд▓реЙрдХрд┐рдВрдЧ рдереНрд░реЗрдбреНрд╕ рдХреЗ рдкреВрд▓ рдореЗрдВ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдкреНрд░рднрд╛рд╡ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рд╕реНрд╡рд┐рдЪ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЕрдЪреНрдЫреЗ рдкреНрд░реАрд╕реЗрдЯ рд╣реЛрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╡рд╛рдВрдЫрд┐рдд рд╣реЛрдиреЗ рдкрд░ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ);
- ┬лeffectBlocking(effect)┬╗ , , .
, , , ┬лblocking┬╗. , - , , ┬лeffectBlocking┬╗ , ZIO ( ).
Cats IO , . , ┬лblocking┬╗, ┬лevalOn┬╗, , , .
( ZIO) (, ), .
9.
, Scala, :
- ┬лReaderT┬╗/ ┬лKleisli┬╗, ;
- ┬лEitherT┬╗, ( ┬лOptionT┬╗, ┬лEitherT┬╗ ┬лUnit┬╗ ).
, (, http4s ┬лKleisli┬╗ ┬лOptionT┬╗). (┬лeffect totation┬╗), ZIO ┬лreader┬╗ ┬лtyped error┬╗ ZIO. ┬лreader┬╗ ┬лtyped error┬╗ , ZIO , . , ┬лTask[A]┬╗, ┬лreader┬╗ ┬лtyped errors┬╗.
ZIO () - . , ZIO , .
Cats IO . , , ┬лreader┬╗ ┬лtyped errors┬╗ ┬лstate┬╗, ┬лwriter┬╗ , .
ZIO 8 Cats IO . , Scala .
10.
ZIO , , . , Scala, .
ZIO 2000 , ┬лtyped errors┬╗ , тАФ 375 . Scala , . , , .
:
. , - , .
- . , . ZIO . Cats IO , , ZIO ( , ).
11.
ZIO , , - .
- , : ┬лZIO. succeed┬╗ ┬лApplicative[F].pure┬╗, ┬лzip┬╗ ┬лApply[F].product┬╗, ┬лZIO.foreach┬╗ ┬лTraverse[F].traverse┬╗.
- (Cats, Cats Effect, Scalaz ).
- , ( ┬лRuntime┬╗, Cats Effect - Cats Effect). тАФ Cats IO.
- .
- . : "zip"/"zipPar", "ZIO.foreach"/"ZIO.foreachPar", "ZIO.succeed"/"ZIO.succeedLazy┬л.
- , ┬л┬╗. ZIO IDE.
- Scala ZIO : ┬лZIO.fromFuture┬╗, ┬лZIO.fromOption┬╗, ┬лZIO.fromEither┬╗, ┬лZIO.fromTry┬╗.
- ┬л┬╗.
, Scala, , ZIO , , , ZIO, . Cats IO , Cats.
, , , ( , , ).
12.
ZIO тАФ - , .
:
- , ┬лRef┬╗, ┬лPromise┬╗, ┬лQueue┬╗, ┬лSemaphore┬╗ ┬лStream┬╗ //;
- STM, , , ;
- ┬лSchedule┬╗, ;
- ┬лClock┬╗, ┬лRandom┬╗, ┬лConsole┬╗ ┬лSystem┬╗ , ;
- , .
- Cats IO . Cats IO , ( ) .
рдирд┐рд╖реНрдХрд░реНрд╖
Cats Effect Scala-, , .
, Cats Effect, , Cats Effect : Cats IO, Monix, Zio.
, . , , , : ZIO Cats Effect .
Scala тАФ . , Scala. ScalaConf , 18 , John A De Goes .