рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░ред
рд╕реНрдХрд╛рд▓рд╛ рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рдЪрд╛рд░ рд╡рд░реНрд╖реЛрдВ рдХреЗ рдмрд╛рдж, рднрд┐рдХреНрд╖реБрдУрдВ рдХреА рдореЗрд░реА рд╕рдордЭ рдЖрдЦрд┐рд░рдХрд╛рд░ рдЙрд╕ рдмрд┐рдВрджреБ рддрдХ рдмрдврд╝ рдЧрдИ рд╣реИ, рдЬрд╣рд╛рдВ рдЖрдк рдЗрд╕реЗ рд╢реНрд░реЗрдгреА рд╕рд┐рджреНрдзрд╛рдВрдд рдФрд░ рдХреНрд▓рд╛рд╕рд┐рдХ
рдореЛрдирдб рдХреЗ рд╕рдВрджрд░реНрдн рдХреЗ рдмрд┐рдирд╛ рджреВрд╕рд░реЛрдВ рдХреЛ рд╕рдордЭрд╛ рд╕рдХрддреЗ рд╣реИрдВ
- рдпрд╣ рдПрдВрдбреЛрдлрдВрдХреНрд╢рди рдХреА рд╢реНрд░реЗрдгреА рдореЗрдВ рд╕рд┐рд░реНрдл рдПрдХ рдореЛрдиреЛрдб рд╣реИ , рдЬреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо
рд╕реЗ рдбрд░рддрд╛ рд╣реИ , рдЬреЛ
рдХрд┐ рдбрд╛рдЗрдХреНрд▓реЛрд░рд╡реЛрд╕ рдХреЙрдХрд░реЛрдЪ рд╕реЗ рднреА рдмрджрддрд░ рдирд╣реАрдВ рд╣реИред
рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рдХреЛрдЯрд▓рд┐рди рдореЗрдВ рд▓рд┐рдЦреЗ рдЬрд╛рдПрдВрдЧреЗ, рдЬреИрд╕реЗ рдпрд╣ рдХрд╛рдлреА рд▓реЛрдХрдкреНрд░рд┐рдп рд╣реИ, рдФрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдХрд╛рдлреА рдХрд╛рд░реНрдпрд╛рддреНрдордХ (рд╢рдмреНрдж рдХреЗ рджреЛрдиреЛрдВ рдЗрдВрджреНрд░рд┐рдпреЛрдВ рдореЗрдВ)ред
рдЪрд▓рд┐рдП рдПрдХ
рдлрд╝рдирдХрд╛рд░ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣рд╛рдБ рдпрд╣ рд╣реИ:
interface Functor<A>
рдЗрд╕рдХрд╛ рдЕрд░реНрде рдХреНрдпрд╛ рд╣реИ? рдПрдХ рдлрд╝рдВрдХреНрдЯрд░ рдПрдХ рдордирдорд╛рдирд╛ рд╕рдВрдЧрдгрдирд╛ рдХрд╛ рдПрдХ рдЕрдореВрд░реНрдд рд╣реИ рдЬреЛ рдЯрд╛рдЗрдк рдП рдХрд╛ рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИред рд╣рдо рдЕрдирджреЗрдЦрд╛ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХреИрд╕реЗ рдПрдХ рдирдпрд╛ рдлрд╝рдирдХрд╛рд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдФрд░, рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рдореВрд▓реНрдп рдХреА рдЧрдгрдирд╛ рдХреИрд╕реЗ рдХрд░реЗрдВ A. рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдлрд╝рдВрдХреНрд╢рдирд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдкреАрдЫреЗ рдЫрд┐рдкрд╛ рд╕рдХрддрд╛ рд╣реИ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рддрд░реНрдХреЛрдВ рдХреЗ рд╕рд╛рде, рдФрд░ рдЬрд░реВрд░реА рдирд╣реАрдВ рдХрд┐ рд╢реБрджреНрдз рдХрд╛рд░реНрдп рд╣реЛред
рдлрд╝рдирдХрд╛рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдЙрджрд╛рд╣рд░рдг:
- рд╕реНрдерд┐рд░
- рдкреНрд░рдХрд╛рд░
A
рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЖрдиреЗ рд╡рд╛рд▓реЗ рддрд░реНрдХреЛрдВ рдХреА рдПрдХ рдордирдорд╛рдиреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ - рд░рд╛рдЬреНрдп рдЫрджреНрдо рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдЬрдирд░реЗрдЯрд░ (рд░реИрдВрдбрдо)
- рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛ рдЬрдирд░реЗрдЯрд░
- рдбрд┐рд╕реНрдХ рд╕реЗ рдпрд╛ рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдкрдврд╝рдирд╛
- рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдЧрдгрдирд╛ - рдлрдирдХрд╛рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЙрд▓рдмреИрдХ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдХреБрдЫ рд╕рдордп рдмрд╛рдж рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛
рд╕реНрдерд┐рд░ рдХреЛ рдЫреЛрдбрд╝рдХрд░, рдЗрди рд╕рднреА рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕рдВрдкрддреНрддрд┐ рд╣реИ - рд╡реЗ рдЖрд▓рд╕реА рд╣реИрдВ, рдЕрд░реНрдерд╛рддреНред рдЧрдгрдирд╛ рд╕реНрд╡рдпрдВ рддрдм рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ рдЬрдм рдлрд╝рдирдХрд╛рд░ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рдЗрд╕рдХреА рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИред
Functor<A>
,
Functor<A>
рд╕реЗ рдЯрд╛рдЗрдк
A
рдХрд╛ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ, рдпрд╛ рдЯрд╛рдЗрдк
A
рдореМрдЬреВрджрд╛ рдореВрд▓реНрдп рд╕реЗ рдПрдХ рдирдпрд╛
Functor<A>
рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ
A
рд▓реЗрдХрд┐рди рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреЗ рд╕рд╛рде рднреА, рдлрд╝рдирдХрд╛рд░ рдмреЗрдХрд╛рд░ рдирд╣реАрдВ рд╣реИ - рдпрджрд┐ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░
B
рд╣рдо
A
рд╕реЗ
B
рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ (рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдПрдХ рдлрд╝рдВрдХреНрд╢рди
(a: A) -> B
) рд╣реИ, рддреЛ рд╣рдо рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ
(f: Functor<A>) -> Functor<B>
рдФрд░ рдЗрд╕реЗ рдирд╛рдо рджреЗрдВ:
interface Functor<A> { fun <B> map(f: (A) -> B): Functor<B> }
рдлрд╝рдирдХрд╛рд░ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдорд╛рдирдЪрд┐рддреНрд░ рд╡рд┐рдзрд┐ рдПрдХ рдордирдорд╛рдирд╛ рдХрд╛рд░реНрдп рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рд╣реИ:
-
map((a) -> a)
рд╣реА рдлрд╝рдирдХрд╛рд░ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП
-
map((a) -> f(a)).map((b) -> g(b))
map(a -> g(f(a))
рд╕рдорд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП
map(a -> g(f(a))
рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рдПрдХ рдлрд╝рдирдХрд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдорд╛рди рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдмрд┐рдЯреНрд╕ рд╣реЛрддреЗ рд╣реИрдВред рдХреЛрдЯрд▓рд┐рди рдореЗрдВ рд╣рдорд╛рд░рд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдЗрддрдиреА рдЖрд╕рд╛рдиреА рд╕реЗ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдЪрд╛рд╣реЗрдВ рддреЛ), рддреЛ рд╣рдо рдПрдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╡рд┐рдзрд┐ рд▓рд┐рдЦреЗрдВрдЧреЗ:
рдПрдХ рдЙрдкрдпреЛрдЧреА
map
рд╕рд╛рде рдлрдВрдХреНрд╢рдирд▓рд░реНрд╕ рдХреЗ рдЕрдиреНрдп рдЙрджрд╛рд╣рд░рдг
- рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп
List<A>
MyInputStream<A>
Optional<A>
рдЕрдм рдЖрдк рднрд┐рдХреНрд╖реБрдУрдВ рдХреЗ рдкрд╛рд╕ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдПрдХ рдореЛрдирдб рджреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрдЪрд╛рд▓рди рд╡рд╛рд▓рд╛ рдПрдХ рдлрд╝рдирдХрд╛рд░ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдлрдиреНрдиреЗ рдХреЗ рд╡рд┐рдкрд░реАрдд рдореЛрдирд╛рдб рдореЗрдВ рдПрдХ рд╕реНрдерд┐рд░ рд╕реЗ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рд╕рдВрдЪрд╛рд▓рди рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕ рдСрдкрд░реЗрд╢рди рдХреЛ
lift
рдХрд╣рд╛ рдЬрд╛рддрд╛
lift
:
fun <A> lift(value: A): Monad<A> = TODO()
рджреВрд╕рд░реЗ рдСрдкрд░реЗрд╢рди рдХреЛ
flatMap
рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкрд╣рд▓реЗ рд╣рдо рдЕрдкрдиреЗ рдкреВрд░реЗ рдореЛрдирдб рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рджреЗрдВрдЧреЗ:
interface Monad<A> {
рдПрдХ рднрд┐рдХреНрд╖реБ рдФрд░ рдПрдХ рдлрд╝рдирдХрд╛рд░ рдХреЗ рдмреАрдЪ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рднрд┐рдХреНрд╖реБрдУрдВ рдХреЛ рдПрдХ-рджреВрд╕рд░реЗ
рдХреЗ рд╕рд╛рде
рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдирдП рд╕рд╛рдзреБрдУрдВ рдХреЛ рдкреИрджрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдмрд╛рдд рд╕реЗ рдЕрдореВрд░реНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреИрд╕реЗ рдореЛрдирд╛рдж рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдХреНрдпрд╛ рдпрд╣ рдбрд┐рд╕реНрдХ рд╕реЗ рдкрдврд╝рддрд╛ рд╣реИ, рдХреНрдпрд╛ рдпрд╣ рдЗрд╕рдХреЗ рдорд╛рди рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдХреНрдпрд╛ рдпрд╣ рдорд╛рди рдореМрдЬреВрдж рд╣реИ ред рджреВрд╕рд░рд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБ - рднрд┐рдХреНрд╖реБрдУрдВ рдХреЛ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рд╕рдВрдпреЛрдЬрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ, рдкрд╣рд▓реЗ рдорда рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рддрд░реНрдХ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЛ рдЫреЛрдбрд╝рдХрд░ред
рдПрдХ рдЙрджрд╛рд╣рд░рдг:
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдиреЗрдЯрд╡рд░реНрдХ рдХрд╛ рдХреЛрдИ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рд╣реИред рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ, рдбреЗрдЯрд╛ рдлрд╝рд╛рдЗрд▓ рдпрд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдкрдврд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрдиреНрд╣реЗрдВ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдпрд╛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕реЗ рдкрдврд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣рд╛рдВ рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ - рдпрд╣ рд╕рдм рдореЛрдирд╛рдб рдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рдХреЛрдб рд╕реНрд╡рдпрдВ рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд░рд╣реЗрдЧрд╛ред
рдкрд╣рд▓реЗ рдЙрджрд╛рд╣рд░рдг рд╕рд░рд▓ рд╣реИ, рд╡рд┐рдХрд▓реНрдк рдореЛрдирд╛рдбред рдХреЛрдЯрд▓рд┐рди рдореЗрдВ, рдЗрд╕рдХреА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрд╛рд╡рд╛ / рд╕реНрдХрд╛рд▓рд╛ рдореЗрдВ рдпрд╣ рдЕрддреНрдпрдВрдд рдЙрдкрдпреЛрдЧреА рд╣реИ:
data class Option<A>(val value: A?) { fun <B> map(f: (A) -> B): Option<B> = flatMap { a -> lift(f(a)) } fun <B> flatMap(f: (A) -> Option<B>): Option<B> = when(value) { null -> Option(null) else -> f(value) } } fun <A> lift(value: A?): Option<A> = Option(value) fun mul(a: Option<Int>, b: Option<Int>): Option<Int> = a.flatMap { a -> b.map { b -> a * b } } fun main(args: Array<String>) { println(mul(Option(4), Option(5)).value)
рдкреЛрдЬрд╝рд╛рдХреЙрд╡рд┐рд░рд┐рд╕реНрдЯреА рдХреЗ рдПрдХ рдорда рдХреЗ рд░реВрдк рдореЗрдВ, рдЪрд▓реЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдХрд╛рдо рдХреЛ рдореЛрдирд╛рдб рдореЗрдВ рд▓рдкреЗрдЯрддреЗ рд╣реИрдВ:
data class DB<A>(val f: (Connection) -> A) { fun <B> map(f: (A) -> B): DB<B> = flatMap { a -> lift(f(a)) } fun <B> flatMap(f: (A) -> DB<B>): DB<B> = DB { conn -> f(this.f(conn)).f(conn) } } fun <A> lift(value: A): DB<A> = DB { value } fun select(id: Int): DB<String> = DB { conn -> val st = conn.createStatement()
рдХреНрдпрд╛ рдЦрд░рдЧреЛрд╢ рдХрд╛ рдЫреЗрдж рдЧрд╣рд░рд╛ рд╣реИ?
рднрд┐рдХреНрд╖реБрдУрдВ рдХреА рдПрдХ рд╡рд┐рд╢рд╛рд▓ рд╡рд┐рд╡рд┐рдзрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдирдХрд╛ рдореБрдЦреНрдп рдЙрджреНрджреЗрд╢реНрдп рдЧрдгрдирд╛ рдХреЗ рдХреБрдЫ рд╡рд┐рд╡рд░рдгреЛрдВ рд╕реЗ рдЖрд╡реЗрджрди рдХреЗ рд╡реНрдпрд╛рдкрд╛рд░рд┐рдХ рддрд░реНрдХ рдХреЛ рдЕрд▓рдЧ рдХрд░рдирд╛ рд╣реИ:
- рд╡рд╣ рдорд╛рди рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:
data class Option<A>(value: A?)
- рдХрд┐ рдЧрдгрдирд╛ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧреА:
data class Either<Error, A>(value: Pair<Error?, A?>)
- рдпрд╣ рдЧрдгрдирд╛ рдЖрд▓рд╕реА рд╣реЛ рд╕рдХрддреА рд╣реИ:
data class Defer<A>(value: () -> A)
- рдпрд╛ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕:
java.util.concurrent.CompletableFuture<A>
- рдпрд╛ рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд░рд╛рдЬреНрдп рд╣реИ:
data class State<S, A>(value: (S) -> Pair<S, A>)
рдЕрдиреБрддреНрддрд░рд┐рдд рдкреНрд░рд╢реНрдиреЛрдВ рдХреА рд╕реВрдЪреА:
- рдПрдкреНрд▓рд╛рдЗрдб рдлрд╝рдВрдХреНрд╢рдирд▓рд░реНрд╕ - рдлрд╝рдВрдХреНрд╢рдирд▓рд░реНрд╕ рдФрд░ рдореЛрдирд╛рдбреНрд╕ рдХреЗ рдмреАрдЪ рдПрдХ рдордзреНрдпрд╡рд░реНрддреА рд▓рд┐рдВрдХ
- рдордареЛрдВ рдХреА рддрд░рд╣ рд╕рдВрдЧреНрд░рд╣
- рдореЛрдиреЛрдЯрд╛рдЗрдкрд┐рдХ рдореЛрдиреЛрдб рдХреА рд░рдЪрдирд╛рдПрдВ - рддреАрд░ рдЧреНрд▓реВрд╕реА, рдореЛрдиреИрдбрд┐рдХ рдЯреНрд░рд╛рдВрд╕рдлрд╛рд░реНрдорд░
- рдЕрдиреБрдХреНрд░рдо / рдЯреНрд░реИрд╡рд░реНрд╕
- рдкреНрд░рднрд╛рд╡ рдХреЗ рд░реВрдк рдореЗрдВ рднрд┐рдХреНрд╖реБрдУрдВ
- рдореЛрдирд╛рдбреНрд╕ рдФрд░ рд░рд┐рдХрд░реНрд╕рд┐рдпрди, рд╕реНрдЯреИрдХ рдУрд╡рд░рдлреНрд▓реЛ, рдЯреНрд░рдореНрдкреЛрд▓рд┐рдирд┐рдВрдЧ
- рдЯреИрдЧрд▓реЗрд╕ рдЕрдВрддрд┐рдо рдПрдиреНрдХреЛрдбрд┐рдВрдЧ
- рдЖрдпреЛ рдореЛрдирд╛рдж
- рдФрд░ рдЖрдо рддреМрд░ рдкрд░ рдорд╛рдирдХ рд╕рд╛рдзреБрдУрдВ рдХрд╛ рдкреВрд░рд╛ рдЪрд┐рдбрд╝рд┐рдпрд╛рдШрд░
рдЖрдЧреЗ рдХреНрдпрд╛ рд╣реИ?
arrow-kt.iotypelevel.org/cats/typeclasses.htmlwiki.haskell.org/All_About_MonadsрдореЗрд░рд╛ рдкреНрд░рдпреЛрдЧ рд╕реНрдХрд╛рд▓рд╛ рдкрд░ рдПрдХ рдкреВрд░реНрдг рдПрдлрдкреА рд╢реИрд▓реА рдХрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╣реИ:
github.com/scf37/fpscala2рдкреАрдПрд╕ рдореИрдВ рдПрдХ рдЫреЛрдЯрд╛ рдиреЛрдЯ рдЪрд╛рд╣рддрд╛ рдерд╛, рдпрд╣ рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣ рдирд┐рдХрд▓рд╛ред