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

9) рд╡рд┐рд╕реНрддрд╛рд░ рд╡рд┐рдзрд┐ рдирд┐рд░реНрдорд╛рддрд╛
рдЖрдЗрдП, рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдмрд╕реЗ рдореВрд▓ рдЙрдкрдХрд░рдг - рд╡рд┐рд╕реНрддрд╛рд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░реЗрдВ, рдЬреЛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╡рд┐рдХрд▓реНрдк, рдпрд╛ рддреЛ, рдЖрджрд┐ рдореЗрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдмрджрд▓ рджреЗрддреЗ рд╣реИрдВ:
Option
рд▓рд┐рдП .some
рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд none
рдирд┐рд░реНрдорд╛рддрд╛ рд╡рд┐рдзрд┐ none
;.asRight
, .asLeft
рд▓рд┐рдП Either
;Validated
рд▓рд┐рдП .valid
, .invalid
, .validNel
, .invalidNel
рдЙрдирдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рджреЛ рдореБрдЦреНрдп рд▓рд╛рдн:
- рдпрд╣ рдЕрдзрд┐рдХ рдХреЙрдореНрдкреИрдХреНрдЯ рдФрд░ рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рд╣реИ (рдЪреВрдВрдХрд┐ рд╡рд┐рдзрд┐ рдХреЙрд▓ рдХрд╛ рдЕрдиреБрдХреНрд░рдо рд╕рд╣реЗрдЬрд╛ рдЧрдпрд╛ рд╣реИ)ред
- рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЗрди рддрд░реАрдХреЛрдВ рдХреЗ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдПрдХ рд╕реБрдкрд░рдЯрд╛рдЗрдк рддрдХ рдмрдврд╝рд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рдд:
import cats.implicits._ Some("a")
рд╣рд╛рд▓рд╛рдБрдХрд┐ рдкрд┐рдЫрд▓реЗ рд╡рд░реНрд╖реЛрдВ рдореЗрдВ рдЯрд╛рдЗрдк рдЗрдВрдлрд╝реЗрдХреНрд╢рди рдореЗрдВ рд╕реБрдзрд╛рд░ рд╣реБрдЖ рд╣реИ, рдФрд░ рд╕рдВрднрд╛рд╡рд┐рдд рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рд╢рд╛рдВрдд рд░рд╣рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ, рдХрдо рд╣реЛ рдЧрдП рд╣реИрдВ, рдЕрддреНрдпрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХреЗ рдХрд╛рд░рдг рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдЖрдЬ рднреА рд╕реНрдХрд╛рд▓рд╛ рдореЗрдВ рд╕рдВрднрд╡ рд╣реИрдВред рдЕрдХреНрд╕рд░, рдПрдХ рдореЗрдЬ рдХреЗ рдЦрд┐рд▓рд╛рдл рдЕрдкрдиреЗ рд╕рд┐рд░ рдХреЛ рдкреАрдЯрдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ рддрдм рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИ рдЬрдм
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
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рднреА, рдЧрдгрдирд╛ рдЕрд▓реНрдкрдХрд╛рд▓рд┐рдХ рдмрдиреА рд╣реБрдИ рд╣реИред * рдореИрдВ рдЖрдкрдХреЛ
Monix
,
IO
рдФрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ
Monix
рдореЗрдВ рдЖрд╕реНрдердЧрд┐рдд рдЧрдгрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ред
рдПрдХ рд╕рдордорд┐рдд рдСрдкрд░реЗрд╢рди рд╣реИ, <*ред рддреЛ, рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ:
success1 <* success2
рдЕрдВрдд рдореЗрдВ, рдпрджрд┐ рдкреНрд░рддреАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрдкрдХреЗ рд▓рд┐рдП рд╡рд┐рджреЗрд╢реА рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рд╕рд╣рд╛рд░рд╛ рд▓реЗрдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред *>
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)
рдХреЗрдХ рдкрд░ рдЪреЗрд░реА: рд╕реНрдХрд╛рд▓рд╛ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рд╣рд░ рдЬрдЧрд╣
lift
рдореМрдЬреВрдж рд╣реИред рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп (рдФрд░ рд╢рд╛рдпрдж рд░реЛрдЬрдорд░реНрд░рд╛ рдХреЗ рдХрд╛рдо рдореЗрдВ рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА) рдЙрджрд╛рд╣рд░рдг
PartialFunction
:
val intMatcher: PartialFunction[Int, String] = { case 1 => "jak si─Щ masz!" } val liftedIntMatcher: Int => Option[String] = intMatcher.lift liftedIntMatcher(1)
рдЕрдм рд╣рдо рдЕрдзрд┐рдХ рджрдмрд╛рд╡ рд╡рд╛рд▓реЗ рдореБрджреНрджреЛрдВ рдкрд░ рдЖрдЧреЗ рдмрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред
6) рдореИрдкрдПрди
mapN
tuples рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдпреЛрдЧреА рд╕рд╣рд╛рдпрдХ рдХрд╛рд░реНрдп рд╣реИред рдлрд┐рд░, рдпрд╣ рдПрдХ рдирд╡реАрдирддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЪреНрдЫреЗ рдкреБрд░рд╛рдиреЗ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рд╣реИ
|@|
рд╡рд╣ рдПрдХ рдЪреАрдЦ рд╣реИред
рдпрд╣рд╛рдБ рджреЛ рддрддреНрд╡реЛрдВ рдХреЗ рдЯрдкрд▓ рдХреЗ рд╕рд╛рде рдореИрдкрдПрди рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:
рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдпрд╣ рд╣рдореЗрдВ рдХрд┐рд╕реА рднреА рдПрдл рд╕реЗ рдПрдХ рдЯреБрдкрд▓ рдХреЗ рдЕрдВрджрд░ рдорд╛рдиреЛрдВ рдХреЛ рдореИрдк рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдПрдХ рдЕрд░реНрдзрд╡реГрддреНрддрд╛рдХрд╛рд░ (рдЙрддреНрдкрд╛рдж) рдФрд░ рдПрдХ рдлрд╝рдирдХрд╛рд░ (рдорд╛рдирдЪрд┐рддреНрд░) рд╣реИрдВред рддреЛ:
import cats.implicits._ ("a".some, "b".some).mapN(_ ++ _)
рд╡реИрд╕реЗ, рдпрд╣ рдордд рднреВрд▓реЛ рдХрд┐ рдмрд┐рд▓реНрд▓рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдЖрдкрдХреЛ
leftmap
рд▓рд┐рдП рдореИрдк рдФрд░
leftmap
рдорд┐рд▓реЗрдЧрд╛:
("a".some, List("b","c").mapN(_ ++ _))
рдПрдХ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧреА
.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._
рддрд░реАрдХреЛрдВ рдХреЗ рд╕рдорд╛рди рдкрд░рд┐рдгрд╛рдо рд╣реЛрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдмрд╛рдж рд╡рд╛рд▓реЗ рд╡рд┐рд╡рд╛рджрд╛рд╕реНрдкрдж рдЯреНрд░рд╛рдВрд╕рдлрд╛рд░реНрдорд░ рдХреЗ рд╕рд╛рдеред
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
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")
рей) рдЧрд▓реА-рд╕рд┐рдпрд╛рд░
рдЧрд▓реА-рдореБрд╣рд▓реНрд▓реЗ рджреЛ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╕рдорд╛рдзрд╛рди рд╣реИ:
- рдЯрд╛рдЗрд▓ рд╡рд░реНрдЧреЛрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдЬреЛ рдЕрдкрдиреЗ рдХрд╛рдиреВрдиреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ 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]
рджреВрд╕рд░реА рдУрд░,
Option.pure
рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ
Option.pure
рдХреЛ рдЖрдпрд╛рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
cats.syntax.monad
рдФрд░ cats.instances.option
:
import cats.syntax.applicative._ import cats.instances.option._ "a".pure[Option]
рдЕрдкрдиреЗ рдЖрдпрд╛рдд рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдХреЗ, рдЖрдк рдЕрдкрдиреА рд╕реНрдХреИрд▓рд╛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдирд┐рд╣рд┐рдд рд╕реНрдХреЛрдк рдХреЛ рд╕реАрдорд┐рдд рдХрд░ рджреЗрдВрдЧреЗ рдФрд░ рдЗрд╕ рддрд░рд╣ рд╕рдВрдХрд▓рди рд╕рдордп рдХреЛ рдХрдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд╣рд╛рд▓рд╛рдБрдХрд┐, рдХреГрдкрдпрд╛: рдирд┐рдореНрди рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЗ рдкреВрд░рд╛ рди рд╣реЛрдиреЗ рдкрд░ рдРрд╕рд╛ рди рдХрд░реЗрдВ:
- рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдмрд┐рд▓реНрд▓рд┐рдпреЛрдВ рдХреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдорд╣рд╛рд░рдд рд╣рд╛рд╕рд┐рд▓ рдХрд░ рд▓реА рд╣реИ
- рдЖрдкрдХреА рдЯреАрдо рдЙрд╕реА рд╕реНрддрд░ рдХреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдорд╛рд▓рд┐рдХ рд╣реИ
рдХреНрдпреЛрдВ? рдХреНрдпреЛрдВрдХрд┐:
рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рджреЛрдиреЛрдВ
cats.implicits
рдФрд░
cats.instances.option
рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╣реИрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдо рд╕рдВрдХрд▓рдХ рдХреЛ рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рджреЛ рдмрд╛рд░ рдЗрд╕рдХреЗ рдирд┐рд╣рд┐рдд рджрд╛рдпрд░реЗ рдХрд╛ рдЖрдпрд╛рдд рдХрд░рддреЗ рд╣реИрдВред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкреНрд░рддреНрдпрд╛рд░реЛрдкрдг рдХреЗ рдкрджрд╛рдиреБрдХреНрд░рдо рдореЗрдВ рдХреЛрдИ рдЬрд╛рджреВ рдирд╣реАрдВ рд╣реИ - рдпрд╣ рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рдПрдХ рд╕реНрдкрд╖реНрдЯ рдЕрдиреБрдХреНрд░рдо рд╣реИред рдЖрдкрдХреЛ рдмрд╕
cats.implicits
рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
cats.implicits
рдФрд░ рдкреНрд░рдХрд╛рд░ рдкрджрд╛рдиреБрдХреНрд░рдо рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВред
рдХреБрдЫ 10-20 рдорд┐рдирдЯ рдХреЗ рд▓рд┐рдП рдЖрдк рдЗрди рдЬреИрд╕реА рд╕рдорд╕реНрдпрд╛рдУрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдЕрдзреНрдпрдпрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдореЗрд░рд╛ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдХрд░реЛ, рдпрд╣ рдирд┐рд╡реЗрд╢ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рднреБрдЧрддрд╛рди рдХрд░реЗрдЧрд╛ред
1) рдмрд┐рд▓реНрд▓рд┐рдпреЛрдВ рдЕрдкрдбреЗрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдордд рднреВрд▓рдирд╛!
рдЖрдк рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХреА рдПрдлрдкреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛рд▓рд╛рддреАрдд рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ
cats
рдФрд░
scalaz
рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдЕрдкрдбреЗрдЯ рд╣реЛ
scalaz
ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рддреМрд░ рдкрд░ рдмрд┐рд▓реНрд▓рд┐рдпреЛрдВ рдХреЛ рд▓реЗрдВред рдпрд╣рд╛рдБ рдХреЗрд╡рд▓ рдирд╡реАрдирддрдо рдкрд░рд┐рд╡рд░реНрддрди рд╣реИрдВ:
рдЗрд╕рд▓рд┐рдП, рдЬрдм рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕рдВрд╕реНрдХрд░рдг рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рди рднреВрд▓реЗрдВ, рдирдП рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдиреЛрдЯреНрд╕ рдкрдврд╝реЗрдВ рдФрд░ рд╕рдордп рдореЗрдВ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВред