рд╕реНрдХрд╛рд▓рд╛ рдореЗрдВ рдХреИрдЯреНрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 9 рд╕реБрдЭрд╛рд╡

рд╕реНрдХрд╛рд▓рд╛ рдореЗрдВ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдХреА рдХреБрдЫ рд╡рд╛рдХреНрдпрд╛рддреНрдордХ рдФрд░ рдЕрд░реНрде рд╕рдВрдмрдВрдзреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдХрд╛рд░рдг рдорд╛рд╕реНрдЯрд░ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдореБрдЦреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреА рдорджрдж рд╕реЗ рдЖрдкрдиреЗ рдЬреЛ рдпреЛрдЬрдирд╛ рдмрдирд╛рдИ рд╣реИ, рдЙрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдХреБрдЫ рднрд╛рд╖рд╛ рдЙрдкрдХрд░рдг рдФрд░ рддрд░реАрдХреЗ рд╕реНрдкрд╖реНрдЯ рдкреНрд░рддреАрдд рд╣реЛрддреЗ рд╣реИрдВ рдЬрдм рдЖрдк рдЙрдирд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрддреЗ рд╣реИрдВ - рд▓реЗрдХрд┐рди рдЕрдзреНрдпрдпрди рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЕрдкрдиреЗ рджрдо рдкрд░, рдЙрдиреНрд╣реЗрдВ рдкрд╣рдЪрд╛рдирдирд╛ рдЗрддрдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИред

рдЗрд╕ рдХрд╛рд░рдг рд╕реЗ, рдореИрдВрдиреЗ рддрдп рдХрд┐рдпрд╛ рдХрд┐ рд╕реНрдХрд╛рд▓рд╛ рдореЗрдВ рдХреБрдЫ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдпреБрдХреНрддрд┐рдпреЛрдВ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдФрд░ рдирд╛рдо рдмрд┐рд▓реНрд▓рд┐рдпреЛрдВ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕реНрдХреЗрд▓рд╛рдЬрд╝ рдореЗрдВ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╕рд╛рдорд╛рдиреНрдп рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рдЖрдзрд╛рд░ рдХреЗ рдХрд╛рд░рдг рд╕рдорд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред



9) рд╡рд┐рд╕реНрддрд╛рд░ рд╡рд┐рдзрд┐ рдирд┐рд░реНрдорд╛рддрд╛


рдЖрдЗрдП, рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдмрд╕реЗ рдореВрд▓ рдЙрдкрдХрд░рдг - рд╡рд┐рд╕реНрддрд╛рд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░реЗрдВ, рдЬреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╡рд┐рдХрд▓реНрдк, рдпрд╛ рддреЛ, рдЖрджрд┐ рдореЗрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдмрджрд▓ рджреЗрддреЗ рд╣реИрдВ:

  • Option рд▓рд┐рдП .some рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд none рдирд┐рд░реНрдорд╛рддрд╛ рд╡рд┐рдзрд┐ none ;
  • .asRight , .asLeft рд▓рд┐рдП Either ;
  • Validated рд▓рд┐рдП .valid , .invalid , .validNel , .invalidNel

рдЙрдирдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рджреЛ рдореБрдЦреНрдп рд▓рд╛рдн:

  1. рдпрд╣ рдЕрдзрд┐рдХ рдХреЙрдореНрдкреИрдХреНрдЯ рдФрд░ рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рд╣реИ (рдЪреВрдВрдХрд┐ рд╡рд┐рдзрд┐ рдХреЙрд▓ рдХрд╛ рдЕрдиреБрдХреНрд░рдо рд╕рд╣реЗрдЬрд╛ рдЧрдпрд╛ рд╣реИ)ред
  2. рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЗрди рддрд░реАрдХреЛрдВ рдХреЗ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдПрдХ рд╕реБрдкрд░рдЯрд╛рдЗрдк рддрдХ рдмрдврд╝рд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рдд:

 import cats.implicits._ Some("a") //Some[String] "a".some //Option[String] 

рд╣рд╛рд▓рд╛рдБрдХрд┐ рдкрд┐рдЫрд▓реЗ рд╡рд░реНрд╖реЛрдВ рдореЗрдВ рдЯрд╛рдЗрдк рдЗрдВрдлрд╝реЗрдХреНрд╢рди рдореЗрдВ рд╕реБрдзрд╛рд░ рд╣реБрдЖ рд╣реИ, рдФрд░ рд╕рдВрднрд╛рд╡рд┐рдд рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рд╢рд╛рдВрдд рд░рд╣рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ, рдХрдо рд╣реЛ рдЧрдП рд╣реИрдВ, рдЕрддреНрдпрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЗ рдХрд╛рд░рдг рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдЖрдЬ рднреА рд╕реНрдХрд╛рд▓рд╛ рдореЗрдВ рд╕рдВрднрд╡ рд╣реИрдВред рдЕрдХреНрд╕рд░, рдПрдХ рдореЗрдЬ рдХреЗ рдЦрд┐рд▓рд╛рдл рдЕрдкрдиреЗ рд╕рд┐рд░ рдХреЛ рдкреАрдЯрдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ рддрдм рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИ рдЬрдм Either рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ ( рдмрд┐рд▓реНрд▓рд┐рдпреЛрдВ рдЕрдзреНрдпрд╛рдп 4.4 рдХреЗ рд╕рд╛рде рд╕реНрдХрд╛рд▓рд╛ рджреЗрдЦреЗрдВ)ред

рд╡рд┐рд╖рдп рдкрд░ рдПрдХ рдФрд░ рдмрд╛рдд: .asRight рдФрд░ .asLeft рдЕрднреА рднреА рдПрдХ рдФрд░ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, "1".asRight[Int] Either[Int, String] ред рдпрджрд┐ рдпрд╣ рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рд╕рдВрдХрд▓рдХ рдЗрд╕реЗ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдЧрд╛ рдФрд░ Nothing рдорд┐рд▓реЗрдЧрд╛ред рдлрд┐рд░ рднреА, рдпрд╣ рд╣рд░ рдмрд╛рд░ рджреЛрдиреЛрдВ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдпрд╛ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛рдУрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред

8) рдлрд┐рдлреНрдЯреА рд╢реЗрдбреНрд╕ *>


рдХрд┐рд╕реА рднреА Apply рд╡рд┐рдзрд┐ рдореЗрдВ (*, Monad , Monad , рдЖрджрд┐ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд) рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ "рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЧрдгрдирд╛ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░реЗрдВ рдФрд░ рджреВрд╕рд░реЗ рддрд░реНрдХ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╕рд╛рде рдкрд░рд┐рдгрд╛рдо рдмрджрд▓реЗрдВ"ред рдХреЛрдб рдХреА рднрд╛рд╖рд╛ рдореЗрдВ ( Monad рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ):

 fa.flatMap(_ => fb) 

рдПрдХ рдСрдкрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдЕрд╕реНрдкрд╖реНрдЯ рдкреНрд░рддреАрдХрд╛рддреНрдордХ рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдХрд░реЗрдВ рдЬрд┐рд╕рдореЗрдВ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рдкреНрд░рднрд╛рд╡ рдирд╣реАрдВ рд╣реИ? ApplicationativeError рдФрд░ / рдпрд╛ MonadError рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реБрдП, рдЖрдк рдкрд╛рдПрдВрдЧреЗ рдХрд┐ рдСрдкрд░реЗрд╢рди рдкреВрд░реЗ рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдХреЗ рд▓рд┐рдП рддреНрд░реБрдЯрд┐ рдкреНрд░рднрд╛рд╡ рдХреЛ рдмрд░рдХрд░рд╛рд░ рд░рдЦрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ Either рд▓реЗрдВ:

 import cats.implicits._ val success1 = "a".asRight[Int] val success2 = "b".asRight[Int] val failure = 400.asLeft[String] success1 *> success2 //Right(b) success2 *> success1 //Right(a) success1 *> failure //Left(400) failure *> success1 //Left(400) 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рднреА, рдЧрдгрдирд╛ рдЕрд▓реНрдкрдХрд╛рд▓рд┐рдХ рдмрдиреА рд╣реБрдИ рд╣реИред * рдореИрдВ рдЖрдкрдХреЛ Monix , IO рдФрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ Monix рдореЗрдВ рдЖрд╕реНрдердЧрд┐рдд рдЧрдгрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ред

рдПрдХ рд╕рдордорд┐рдд рдСрдкрд░реЗрд╢рди рд╣реИ, <*ред рддреЛ, рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ:

 success1 <* success2 //Right(a) 

рдЕрдВрдд рдореЗрдВ, рдпрджрд┐ рдкреНрд░рддреАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрдкрдХреЗ рд▓рд┐рдП рд╡рд┐рджреЗрд╢реА рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рд╕рд╣рд╛рд░рд╛ рд▓реЗрдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред *> productR рд▓рд┐рдП рд╕рд┐рд░реНрдл рдПрдХ рдЙрдкрдирд╛рдо рд╣реИ, рдФрд░ * productL рд▓рд┐рдП рдПрдХ рдЙрдкрдирд╛рдо рд╣реИред

рдЯрд┐рдкреНрдкрдгреА


рдПрдХ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдмрд╛рддрдЪреАрдд рдореЗрдВ, рдПрдбрдо рд╡рд╛рд░рд╕реНрдХреА (рдзрдиреНрдпрд╡рд╛рдж, рдПрдбрдо!) рдиреЗ рдареАрдХ рд╣реА рдЯрд┐рдкреНрдкрдгреА рдХреА рдХрд┐ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ *> ( productR ) рдХреЗ рдЕрд▓рд╛рд╡рд╛ productR рд╕реЗ рднреА рд╣реИред >> fa.flatMap(_ => fb) рдХреЗ рд╕рдорд╛рди рд╣реА рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рджреЛ рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде:

  • рдЗрд╕реЗ productR рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рдЕрдиреБрдмрдВрдз рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИ (рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ, рдЗрд╕реЗ рдмрд┐рдирд╛ рдорда рдХреЗ рдХрд╛рдиреВрдиреЛрдВ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд┐рдП рдмрд┐рдирд╛ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ MonadError рдмрд╛рд░реЗ рдореЗрдВ рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ), рддреЛ рдЖрдкрдХреЛ рдиреБрдХрд╕рд╛рди рдирд╣реАрдВ рд╣реЛрдЧрд╛;
  • рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд, >> рдХреЙрд▓-рдмрд╛рдп-рдирд╛рдо рд╕реЗ рдПрдХ рджреВрд╕рд░рд╛ рдСрдкрд░реЗрдВрдб рд╣реИ, рдЕрд░реНрдерд╛рддреНред fb: => F[B] ред рдпрджрд┐ рдЖрдк рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╕реНрдЯреИрдХ рд╡рд┐рд╕реНрдлреЛрдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рд╢рдмреНрджрд╛рд░реНрде рдореЗрдВ рдЕрдВрддрд░ рдореМрд▓рд┐рдХ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рдЗрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдореИрдВрдиреЗ * * рдЕрдзрд┐рдХ рдмрд╛рд░ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛ред рдПрдХ рддрд░реАрдХрд╛ рдпрд╛ рджреВрд╕рд░рд╛, рдКрдкрд░ рд╕реВрдЪреАрдмрджреНрдз рдХрд╛рд░рдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдордд рднреВрд▓рдирд╛ред

7) рдкрд╛рд▓ рдЙрдард╛рдЗрдпреЗ!


рдХрдИ рд▓реЛрдЧ lift рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЛ рдЕрдкрдиреЗ рд╕рд┐рд░ рдореЗрдВ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордп рд▓реЗрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЬрдм рдЖрдк рд╕рдлрд▓ рд╣реЛрдВрдЧреЗ, рддреЛ рдЖрдк рдкрд╛рдПрдВрдЧреЗ рдХрд┐ рд╡рд╣ рд╣рд░ рдЬрдЧрд╣ рд╣реИред

рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреА рд╣рд╡рд╛ рдореЗрдВ рдмрдврд╝рддреЗ рд╣реБрдП рдХрдИ рд╢рдмреНрджреЛрдВ рдХреА рддрд░рд╣, lift рд╢реНрд░реЗрдгреА рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рд╕реЗ рдЖрдИ рдереАред рдореИрдВ рд╕рдордЭрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛: рдПрдХ рдСрдкрд░реЗрд╢рди рдХрд░реЗрдВ, рдЗрд╕рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЛ рдмрджрд▓ рджреЗрдВ рддрд╛рдХрд┐ рдпрд╣ рд╕реАрдзреЗ рд╕рд╛рд░ рдкреНрд░рдХрд╛рд░ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реЛ рдЬрд╛рдПред

рдмрд┐рд▓реНрд▓рд┐рдпреЛрдВ рдореЗрдВ, рд╕рдмрд╕реЗ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдлрдирдХрд╛рд░ рд╣реИ :

 def lift[A, B](f: A => B): F[A] => F[B] = map(_)(f) 

рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ: рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдмрджрд▓ рджреЗрдВ рддрд╛рдХрд┐ рдпрд╣ рджрд┐рдП рдЧрдП рдкреНрд░рдХрд╛рд░ рдХреЗ рдлрд╝рдВрдХреНрдЯрд░ рдПрдл рдкрд░ рдХрд╛рд░реНрдп рдХрд░реЗред

рд▓рд┐рдлреНрдЯ рдлрд╝рдВрдХреНрд╢рди рдЕрдХреНрд╕рд░ рджрд┐рдП рдЧрдП рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдиреЗрд╕реНрдЯреЗрдб рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░реЛрдВ рдХрд╛ рдкрд░реНрдпрд╛рдп рдмрди рдЬрд╛рддрд╛ рд╣реИред рддреЛ, EitherT.liftF рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ EitherT.right. рд╕реНрдХреЗрд▓рдбреЙрдХ рд╕реЗ рдЙрджрд╛рд╣рд░рдг :

 import cats.data.EitherT import cats.implicits._ EitherT.liftF("a".some) //EitherT(Some(Right(a))) EitherT.liftF(none[String]) //EitherT(None) 

рдХреЗрдХ рдкрд░ рдЪреЗрд░реА: рд╕реНрдХрд╛рд▓рд╛ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рд╣рд░ рдЬрдЧрд╣ lift рдореМрдЬреВрдж рд╣реИред рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп (рдФрд░ рд╢рд╛рдпрдж рд░реЛрдЬрдорд░реНрд░рд╛ рдХреЗ рдХрд╛рдо рдореЗрдВ рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА) рдЙрджрд╛рд╣рд░рдг PartialFunction :

 val intMatcher: PartialFunction[Int, String] = { case 1 => "jak si─Щ masz!" } val liftedIntMatcher: Int => Option[String] = intMatcher.lift liftedIntMatcher(1) //Some(jak si─Щ masz!) liftedIntMatcher(0) //None intMatcher(1) //jak si─Щ masz! intMatcher(0) //Exception in thread "main" scala.MatchError: 0 

рдЕрдм рд╣рдо рдЕрдзрд┐рдХ рджрдмрд╛рд╡ рд╡рд╛рд▓реЗ рдореБрджреНрджреЛрдВ рдкрд░ рдЖрдЧреЗ рдмрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред

6) рдореИрдкрдПрди


mapN tuples рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдпреЛрдЧреА рд╕рд╣рд╛рдпрдХ рдХрд╛рд░реНрдп рд╣реИред рдлрд┐рд░, рдпрд╣ рдПрдХ рдирд╡реАрдирддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЪреНрдЫреЗ рдкреБрд░рд╛рдиреЗ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рд╣реИ |@| рд╡рд╣ рдПрдХ рдЪреАрдЦ рд╣реИред

рдпрд╣рд╛рдБ рджреЛ рддрддреНрд╡реЛрдВ рдХреЗ рдЯрдкрд▓ рдХреЗ рд╕рд╛рде рдореИрдкрдПрди рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:

 // where t2: Tuple2[F[A0], F[A1]] def mapN[Z](f: (A0, A1) => Z)(implicit functor: Functor[F], semigroupal: Semigroupal[F]): F[Z] = Semigroupal.map2(t2._1, t2._2)(f) 

рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдпрд╣ рд╣рдореЗрдВ рдХрд┐рд╕реА рднреА рдПрдл рд╕реЗ рдПрдХ рдЯреБрдкрд▓ рдХреЗ рдЕрдВрджрд░ рдорд╛рдиреЛрдВ рдХреЛ рдореИрдк рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдПрдХ рдЕрд░реНрдзрд╡реГрддреНрддрд╛рдХрд╛рд░ (рдЙрддреНрдкрд╛рдж) рдФрд░ рдПрдХ рдлрд╝рдирдХрд╛рд░ (рдорд╛рдирдЪрд┐рддреНрд░) рд╣реИрдВред рддреЛ:

 import cats.implicits._ ("a".some, "b".some).mapN(_ ++ _) //Some(ab) (List(1, 2), List(3, 4), List(0, 2).mapN(_ * _ * _)) //List(0, 6, 0, 8, 0, 12, 0, 16) 

рд╡реИрд╕реЗ, рдпрд╣ рдордд рднреВрд▓реЛ рдХрд┐ рдмрд┐рд▓реНрд▓рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдЖрдкрдХреЛ leftmap рд▓рд┐рдП рдореИрдк рдФрд░ leftmap рдорд┐рд▓реЗрдЧрд╛:

 ("a".some, List("b","c").mapN(_ ++ _)) //won't compile, because outer type is not the same ("a".some, List("b", "c")).leftMap(_.toList).mapN(_ ++ _) //List(ab, ac) 

рдПрдХ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧреА .mapN рдлрдВрдХреНрд╢рди рддрддреНрдХрд╛рд▓ рдХреЗрд╕ рдХреНрд▓рд╛рд╕реЗрд╕ рд╣реИ:

 case class Mead(name: String, honeyRatio: Double, agingYears: Double) ("p├│┼Вtorak".some, 0.5.some, 3d.some).mapN(Mead) //Some(Mead(p├│┼Вtorak,0.5,3.0)) 

рдмреЗрд╢рдХ, рдЖрдк рдЗрд╕рдХреЗ рд▓рд┐рдП рд▓реВрдк рдСрдкрд░реЗрдЯрд░ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдкрдПрди рд╕рд░рд▓ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдореЛрдиреЛрдПрдб рдЯреНрд░рд╛рдВрд╕рдлрд╛рд░реНрдорд░ рд╕реЗ рдмрдЪрддрд╛ рд╣реИред

 import cats.effect.IO import cats.implicits._ //interchangable with eg Monix's Task type Query[T] = IO[Option[T]] def defineMead(qName: Query[String], qHoneyRatio: Query[Double], qAgingYears: Query[Double]): Query[Mead] = (for { name <- OptionT(qName) honeyRatio <- OptionT(qHoneyRatio) agingYears <- OptionT(qAgingYears) } yield Mead(name, honeyRatio, agingYears)).value def defineMead2(qName: Query[String], qHoneyRatio: Query[Double], qAgingYears: Query[Double]): Query[Mead] = for { name <- qName honeyRatio <- qHoneyRatio agingYears <- qAgingYears } yield (name, honeyRatio, agingYears).mapN(Mead) 

рддрд░реАрдХреЛрдВ рдХреЗ рд╕рдорд╛рди рдкрд░рд┐рдгрд╛рдо рд╣реЛрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдмрд╛рдж рд╡рд╛рд▓реЗ рд╡рд┐рд╡рд╛рджрд╛рд╕реНрдкрдж рдЯреНрд░рд╛рдВрд╕рдлрд╛рд░реНрдорд░ рдХреЗ рд╕рд╛рдеред

5) рдиреЗрд╕реНрдЯреЗрдб


Nested рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдореЛрдирд╛рдб рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдорд░ рдХрд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдбрдмрд▓ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдирд╛рдо рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ, рдпрд╣ рдЖрдкрдХреЛ рдХреБрдЫ рд╢рд░реНрддреЛрдВ рдХреЗ рддрд╣рдд рдЕрдиреБрд▓рдЧреНрдирдХ рд╕рдВрдЪрд╛рд▓рди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрд╣рд╛рдБ .map(_.map( : рд▓рд┐рдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ .map(_.map( :

 import cats.implicits._ import cats.data.Nested val someValue: Option[Either[Int, String]] = "a".asRight.some Nested(someValue).map(_ * 3).value //Some(Right(aaa)) 

Functor рдЕрд▓рд╛рд╡рд╛, Nested Functor , Functor ApplicativeError рдФрд░ Traverse рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рдХрд░рддрд╛ рд╣реИред рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА рдФрд░ рдЙрджрд╛рд╣рд░рдг рдпрд╣рд╛рдБ рд╣реИрдВ ред

4) .recover / .recoverWith / .handleError / .handleErrorWith / .valueOr


рд╕реНрдХрд╛рд▓рд╛ рдореЗрдВ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдкреНрд░рднрд╛рд╡ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдХреБрдЫ рд╣реИред MonadError рдФрд░ MonadError рдХреБрдЫ рдЙрдкрдпреЛрдЧреА рддрд░реАрдХреЗ рд╣реИрдВ, рдФрд░ рдЪрд╛рд░ рдореБрдЦреНрдп рд▓реЛрдЧреЛрдВ рдХреЗ рдмреАрдЪ рд╕реВрдХреНрд╖реНрдо рдЕрдВрддрд░ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЖрдкрдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рддреЛ, ApplicativeError F[A]:

  • handleError рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХреЙрд▓ рдмрд┐рдВрджреБ рдкрд░ рд╕рднреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдП рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИред
  • recover рдЗрд╕реА рддрд░рд╣ рд╕реЗ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдВрд╢рд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЪреБрдиреА рдЧрдИ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдП рдореЗрдВ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИред
  • handleErrorWith рдХреЗ рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдкрд░рд┐рдгрд╛рдо F[A] рддрд░рд╣ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдпрд╣ рдЖрдкрдХреЛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред
  • recoverWith рдареАрдХ рд╣реЛрдиреЗ рдЬреИрд╕рд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк F[A] рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдк handleErrorWith рдХреЛ handleErrorWith рд▓рд┐рдП рд╕реАрдорд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ recoverWith , рдЬреЛ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдзрд┐ рдХреЗ рдЕрдкрдиреЗ рдлрд╛рдпрджреЗ рд╣реИрдВ рдФрд░ рдЕрдкрдиреЗ рддрд░реАрдХреЗ рд╕реЗ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИрдВред

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдореИрдВ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдПрдкреНрд▓рд┐рдХреЗрд░рд┐рд╡ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдкрд░рд┐рдЪрд┐рдд рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ, рдЬреЛ рдХрд┐ рдХреИрдЯреНрд╕ рдореЗрдВ рд╕рдмрд╕реЗ рдЕрдореАрд░ рд╣реИ рдФрд░ рдореЛрдирд╛рдбреЗрдпреЛрд░ рдореЗрдВ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ - рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдпрд╣ рдмрд┐рд▓реНрд▓рд┐рдпреЛрдВ рдореЗрдВ рд╕рдорд░реНрдерд┐рдд рд╣реИред

Either/EitherT , Validated рдФрд░ Ior - .valueOr рд▓рд┐рдП рдПрдХ рдФрд░ рддрд░реАрдХрд╛ рд╣реИред рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ, рдпрд╣ Option рд▓рд┐рдП .getOrElse рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ "рдмрд╛рдИрдВ рдУрд░" рд╡рд╛рд▓реА рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рд╣реИред

 import cats.implicits._ val failure = 400.asLeft[String] failure.valueOr(code => s"Got error code $code") //"Got error code 400" 

рей) рдЧрд▓реА-рд╕рд┐рдпрд╛рд░


рдЧрд▓реА-рдореБрд╣рд▓реНрд▓реЗ рджреЛ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╕рдорд╛рдзрд╛рди рд╣реИ:

  • рдЯрд╛рдЗрд▓ рд╡рд░реНрдЧреЛрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдЬреЛ рдЕрдкрдиреЗ рдХрд╛рдиреВрдиреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ 100%;
  • рдЕрд╕рд╛рдорд╛рдиреНрдп рд╕рд╣рд╛рдпрдХ рдЯрд╛рдЗрдкрдХреНрд▓рд╛рд╕реА, рдЬрд┐рд╕рдХрд╛ рдареАрдХ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред

рдРрддрд┐рд╣рд╛рд╕рд┐рдХ рд░реВрдк рд╕реЗ, Try рд▓рд┐рдП рдореЛрдирд╛рдб рдЙрджрд╛рд╣рд░рдг рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ Try , рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рдШрд╛рддрдХ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╕рднреА рд╡рд┐рд╡рд╛рджрд╛рд╕реНрдкрдж рдХрд╛рдиреВрдиреЛрдВ рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЕрдм рд╡рд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд┐рд▓реНрд▓рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкреЗрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдЗрд╕рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕ рдореЙрдбреНрдпреВрд▓ рд╕реЗ рдЦреБрдж рдХреЛ рдкрд░рд┐рдЪрд┐рдд рдХрд░реЗрдВ, рдпрд╣ рдЖрдкрдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

2) рдЬрд┐рдореНрдореЗрджрд╛рд░реА рд╕реЗ рдЖрдпрд╛рдд рдХрд╛ рдЗрд▓рд╛рдЬ рдХрд░реЗрдВ


рдЖрдкрдХреЛ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП - рдкреНрд░рд▓реЗрдЦрди, рдкреБрд╕реНрддрдХ, рдпрд╛ рдХрд╣реАрдВ рдФрд░ рд╕реЗ - рдХрд┐ рдмрд┐рд▓реНрд▓рд┐рдпрд╛рдБ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЖрдпрд╛рдд рдкрджрд╛рдиреБрдХреНрд░рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИрдВ:

рдореВрд▓ (рдХрд░реНрдиреЗрд▓) рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП cats.x ;
рдорд╛рдиреНрдп, рдореЛрдирд╛рдб рдЯреНрд░рд╛рдВрд╕рдлрд╛рд░реНрдорд░, рдЖрджрд┐ рдЬреИрд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП cats.data ;
cat.syntax.x._ рд╡рд┐рд╕реНрддрд╛рд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрд╛рдХрд┐ рдЖрдк sth.asRight, sth.pure, рдЖрджрд┐ рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХреЗрдВред
cats.instances.x. _ рд╡рд┐рднрд┐рдиреНрди рдЯрд╛рдЗрдкрдХреНрд▓рд╛рд╕реЗрд╕ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╕реАрдзреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдареЛрд╕ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдирд┐рд╣рд┐рдд рджрд╛рдпрд░реЗ рдореЗрдВ рдЖрдпрд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрд╛рдХрд┐ рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, sth.pure, рддреНрд░реБрдЯрд┐ "рдирд┐рд╣рд┐рдд рдирд╣реАрдВ рдорд┐рд▓реА" рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред

рдмреЗрд╢рдХ, рдЖрдкрдиреЗ cats.implicits._ . cats.implicits._ рдХреЗ рдЖрдпрд╛рдд рдкрд░ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рд╣реИ, рдЬреЛ рдирд┐рд╣рд┐рдд рд╡рд░реНрдЧ рдореЗрдВ рд╕рднреА рд╡рд░реНрдЧ рдХреЗ рд╕рднреА рд╕рд┐рдВрдЯреИрдХреНрд╕ рдФрд░ рд╕рднреА рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдЖрдпрд╛рдд рдХрд░рддрд╛ рд╣реИред

рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдмрд┐рд▓реНрд▓рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╡рд┐рдХрд╕рд┐рдд рд╣реЛрдиреЗ рдкрд░, рдЖрдкрдХреЛ рдЕрдХреНрд╕рд░ рдкреВрдЫреЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рд╢реНрди рд╕реЗ рдЖрдпрд╛рдд рдХреЗ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдХреНрд░рдо рд╕реЗ рд╢реБрд░реВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрд░реНрдерд╛рддреН:

 import cats._ import cats.data._ import cats.implicits._ 

рдпрджрд┐ рдЖрдк рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдмреЗрд╣рддрд░ рдЬрд╛рдирддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕реЗ рдЕрдкрдиреЗ рд╕реНрд╡рд╛рдж рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдПрдХ рд╕рд░рд▓ рдирд┐рдпрдо рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВ:

  • cats.syntax.x рдПрдХреНрд╕ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ;
  • cats.instances.x рдЙрджрд╛рд╣рд░рдг рдХрдХреНрд╖рд╛рдПрдВ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдкрдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ .asRight , рдЬреЛ рдХрд┐ Either рд▓рд┐рдП рдПрдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╡рд┐рдзрд┐ рд╣реИ, рдирд┐рдореНрди рдХрд╛рд░реНрдп рдХрд░реЗрдВ:

 import cats.syntax.either._ "a".asRight[Int] //Right[Int, String](a) 

рджреВрд╕рд░реА рдУрд░, Option.pure рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ Option.pure рдХреЛ рдЖрдпрд╛рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред cats.syntax.monad рдФрд░ cats.instances.option :

 import cats.syntax.applicative._ import cats.instances.option._ "a".pure[Option] //Some(a) 

рдЕрдкрдиреЗ рдЖрдпрд╛рдд рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдХреЗ, рдЖрдк рдЕрдкрдиреА рд╕реНрдХреИрд▓рд╛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдирд┐рд╣рд┐рдд рд╕реНрдХреЛрдк рдХреЛ рд╕реАрдорд┐рдд рдХрд░ рджреЗрдВрдЧреЗ рдФрд░ рдЗрд╕ рддрд░рд╣ рд╕рдВрдХрд▓рди рд╕рдордп рдХреЛ рдХрдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд╣рд╛рд▓рд╛рдБрдХрд┐, рдХреГрдкрдпрд╛: рдирд┐рдореНрди рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЗ рдкреВрд░рд╛ рди рд╣реЛрдиреЗ рдкрд░ рдРрд╕рд╛ рди рдХрд░реЗрдВ:

  • рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдмрд┐рд▓реНрд▓рд┐рдпреЛрдВ рдХреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдорд╣рд╛рд░рдд рд╣рд╛рд╕рд┐рд▓ рдХрд░ рд▓реА рд╣реИ
  • рдЖрдкрдХреА рдЯреАрдо рдЙрд╕реА рд╕реНрддрд░ рдХреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдорд╛рд▓рд┐рдХ рд╣реИ

рдХреНрдпреЛрдВ? рдХреНрдпреЛрдВрдХрд┐:

 //  ,   `pure`, //    import cats.implicits._ import cats.instances.option._ "a".pure[Option] //could not find implicit value for parameter F: cats.Applicative[Option] 

рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рджреЛрдиреЛрдВ cats.implicits рдФрд░ cats.instances.option рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╣реИрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдо рд╕рдВрдХрд▓рдХ рдХреЛ рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рджреЛ рдмрд╛рд░ рдЗрд╕рдХреЗ рдирд┐рд╣рд┐рдд рджрд╛рдпрд░реЗ рдХрд╛ рдЖрдпрд╛рдд рдХрд░рддреЗ рд╣реИрдВред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкреНрд░рддреНрдпрд╛рд░реЛрдкрдг рдХреЗ рдкрджрд╛рдиреБрдХреНрд░рдо рдореЗрдВ рдХреЛрдИ рдЬрд╛рджреВ рдирд╣реАрдВ рд╣реИ - рдпрд╣ рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рдПрдХ рд╕реНрдкрд╖реНрдЯ рдЕрдиреБрдХреНрд░рдо рд╣реИред рдЖрдкрдХреЛ рдмрд╕ cats.implicits рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред cats.implicits рдФрд░ рдкреНрд░рдХрд╛рд░ рдкрджрд╛рдиреБрдХреНрд░рдо рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВред

рдХреБрдЫ 10-20 рдорд┐рдирдЯ рдХреЗ рд▓рд┐рдП рдЖрдк рдЗрди рдЬреИрд╕реА рд╕рдорд╕реНрдпрд╛рдУрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдЕрдзреНрдпрдпрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдореЗрд░рд╛ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдХрд░реЛ, рдпрд╣ рдирд┐рд╡реЗрд╢ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рднреБрдЧрддрд╛рди рдХрд░реЗрдЧрд╛ред

1) рдмрд┐рд▓реНрд▓рд┐рдпреЛрдВ рдЕрдкрдбреЗрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдордд рднреВрд▓рдирд╛!


рдЖрдк рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреА рдПрдлрдкреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛рд▓рд╛рддреАрдд рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ cats рдФрд░ scalaz рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдЕрдкрдбреЗрдЯ рд╣реЛ scalaz ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рддреМрд░ рдкрд░ рдмрд┐рд▓реНрд▓рд┐рдпреЛрдВ рдХреЛ рд▓реЗрдВред рдпрд╣рд╛рдБ рдХреЗрд╡рд▓ рдирд╡реАрдирддрдо рдкрд░рд┐рд╡рд░реНрддрди рд╣реИрдВ:


рдЗрд╕рд▓рд┐рдП, рдЬрдм рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕рдВрд╕реНрдХрд░рдг рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рди рднреВрд▓реЗрдВ, рдирдП рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдиреЛрдЯреНрд╕ рдкрдврд╝реЗрдВ рдФрд░ рд╕рдордп рдореЗрдВ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВред

Source: https://habr.com/ru/post/hi448128/


All Articles