рдлрд╝рдВрдХреНрд╢рдВрд╕ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рдВрд╕, рдРрдкреНрд▓рд┐рдХреЗрдВрдЯ рдлрд╝рдВрдХреНрд╢рдирд▓рд░реНрд╕ рдФрд░ рдореЛрдирд╛рдбреНрд╕

рдпрд╣рд╛рдБ рдПрдХ рд╕рд░рд▓ рдЕрд░реНрде рд╣реИ:


рдФрд░ рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕ рдкрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд░реЗрдВ:


Brainerред рддреЛ рдЕрдм рдЪрд▓рд┐рдП рдХрд╛рд░реНрдп рдХреЛ рдЬрдЯрд┐рд▓ рдХрд░рддреЗ рд╣реИрдВ - рд╕рдВрджрд░реНрдн рдХреЛ рдорд╣рддреНрд╡ рджреЗрддреЗ рд╣реИрдВред рдЕрднреА рдХреЗ рд▓рд┐рдП, рдЖрдк рдПрдХ рдмреЙрдХреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрджрд░реНрдн рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдЖрдк рдПрдХ рдореВрд▓реНрдп рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ:


рдЕрдм, рдЬрдм рдЖрдк рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЗрд╕ рдорд╛рди рдкрд░ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рд╕рдВрджрд░реНрдн рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓реЗрдВрдЧреЗред рдпрд╣ рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░ рд╣реИ рдЬрд┐рд╕ рдкрд░ рдлрдВрдХреНрд╢рдирд▓рд░реНрд╕, рдПрдкреНрд▓рд┐рдХреЗрдВрдЯ рдлрдВрдХреНрд╢рдирд▓рд░реНрд╕, рдореЛрдирдбреНрд╕, рдПрд░реЛ рдЖрджрд┐ рдЖрдзрд╛рд░рд┐рдд рд╣реИрдВред Maybe рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рджреЛ рд╕рдВрдмрдВрдзрд┐рдд рд╕рдВрджрд░реНрднреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ:


 data Maybe a = Nothing | Just a 

рдмрд╛рдж рдореЗрдВ рд╣рдо Just a рдмрдирд╛рдо Nothing рдХреЗ рдлрдВрдХреНрд╢рди рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдЕрдВрддрд░ рджреЗрдЦреЗрдВрдЧреЗред рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ, рдЪрд▓реЛ рдлрдВрдХреНрд╢рдВрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ!

functors


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


рдФрд░ рдпрд╣рд╛рдБ fmap рдорджрдж рдХрд░рдиреЗ рдХреА рдЬрд▓реНрджреА рдореЗрдВ рд╣реИред fmap - рд╕рдбрд╝рдХ рд╕реЗ рдПрдХ рдЖрджрдореА, fmap рд╕рдВрджрд░реНрднреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдХреБрдЫ рдЬрд╛рдирддрд╛ рд╣реИред рд╡рд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХрд┐рд╕реА рд╕рдВрджрд░реНрдн рдореЗрдВ рдкреИрдХ рдХрд┐рдП рдЧрдП рдорд╛рди рдкрд░ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЖрдк Just 2 рдкрд░ (+3) рдЖрд╡реЗрджрди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред fmap рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
 > fmap (+3) (Just 2) Just 5 




рд╡реИрдо! fmap рдиреЗ рд╣рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИ! рд▓реЗрдХрд┐рди рд╡рд╣ рдХреИрд╕реЗ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдП?

рддреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдлрдирдХрд╛рд░ рдХреНрдпрд╛ рд╣реИ?


рдПрдХ рдлрд╝рдирдХрд╛рд░ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╡рд░реНрдЧ рд╣реИ ред рдпрд╣рд╛рдБ рдЙрд╕рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рд╣реИ:


рдПрдХ fmap рдПрдХ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ fmap рдкрд░ fmap рдХреИрд╕реЗ fmap рдЬрд╛рддрд╛ рд╣реИред рдФрд░ рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ fmap рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:


рддреЛ рд╣рдо рдХреНрдпрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
 > fmap (+3) (Just 2) Just 5 


рдФрд░ fmap рдЬрд╛рджреБрдИ рд░реВрдк рд╕реЗ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рд╛рдЧреВ fmap рдХреНрдпреЛрдВрдХрд┐ Maybe рд╣реИ Maybe рдпрд╣ рдПрдХ рдлрд╝рдирдХрд╛рд░ рд╣реИред рдпрд╣ рдХреИрд╕реЗ рдФрд░ Nothing рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ:
 instance Functor Maybe where fmap func (Just val) = Just (func val) fmap func Nothing = Nothing 


рдЬрдм рд╣рдо fmap (+3) (Just 2) рд▓рд┐рдЦрддреЗ рд╣реИрдВ рддреЛ рдкрд░реНрджреЗ рдХреЗ рдкреАрдЫреЗ рдпрд╣реА рд╣реЛрддрд╛ рд╣реИ:


рдФрд░ рдлрд┐рд░ рдЖрдк рдХрд╣рддреЗ рд╣реИрдВ: "рдареАрдХ рд╣реИ, fmap , рд▓реЗрдХрд┐рди рдХреГрдкрдпрд╛ (+3) Nothing рд▓рд╛рдЧреВ рдХрд░реЗрдВред"


 > fmap (+3) Nothing Nothing 



рдмрд┐рд▓ рдУ'рд░рд┐рд▓реА рдХрд╛ рд╢рд╛рдпрдж рдлрд╝рдирдХрд╛рд░ рдореЗрдВ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ

рдж рдореИрдЯреНрд░рд┐рдХреНрд╕ рдореЗрдВ рдореЙрд░реНрдлрд┐рдпрд╕ рдХреА рддрд░рд╣, fmap рдкрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ; рдЖрдкрдиреЗ Nothing рднреА Nothing рд╕рд╛рде рд╢реБрд░реВ рдХрд┐рдпрд╛ рдФрд░ Nothing рднреА Nothing рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛! рдпрд╣ fmap рдЬрд╝реЗрди рд╣реИред рдФрд░ рдЕрдм рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ Maybe рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдХреНрдпреЛрдВ рдореМрдЬреВрдж рд╣реИред рдпрд╣рд╛рдБ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдмрд┐рдирд╛ рднрд╛рд╖рд╛ рдореЗрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ:
 post = Post.find_by_id(1) if post return post.title else return nil end 


рд╣рд╛рд╕реНрдХреЗрд▓ рдкрд░:
 fmap (getPostTitle) (findPost 1) 


рдпрджрд┐ findPost рдХреЛрдИ рд╕рдВрджреЗрд╢ рджреЗрддрд╛ рд╣реИ, рддреЛ рд╣рдо getPostTitle рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрд╕рдХрд╛ рд╢реАрд░реНрд╖ рд▓реЗрдЦ getPostTitle ред рдЕрдЧрд░ рд╡рд╣ Nothing рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдо Nothing рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ! рдмрд╣реБрдд рдЦреВрдмрд╕реВрд░рдд, рд╣реБрд╣?
<$> рдПрдХ рдирдпрд╛ рд╕рдВрд╕реНрдХрд░рдг рд╣реИ, рддреЛ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдХреЛрдб рдХреЗ рдКрдкрд░ рдЖрдк рдЕрдХреНрд╕рд░ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ:
 getPostTitle <$> (findPost 1) 


рдпрд╣рд╛рдВ рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг рд╣реИ: рдЬрдм рдЖрдк рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХрд┐рд╕реА рд╕реВрдЪреА рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ?


рд╕реВрдЪрд┐рдпрд╛рдБ рднреА рдлрдВрдХреНрд╢рдирд▓рд░реНрд╕ рд╣реИрдВ! рдпрд╣рд╛рдБ рдкрд░рд┐рднрд╛рд╖рд╛ рд╣реИ:
 instance Functor [] where fmap = map 


рдареАрдХ рд╣реИ, рдареАрдХ рд╣реИ, рдПрдХ рдФрд░ (рдЕрдВрддрд┐рдо) рдЙрджрд╛рд╣рд░рдг: рдЬрдм рдЖрдк рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рджреВрд╕рд░реЗ рдлрд╝рдВрдХреНрд╢рди рдкрд░ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ?
 fmap (+3) (+1) 


рдпрд╣рд╛рдБ рд╕рдорд╛рд░реЛрд╣ рд╣реИ:


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


рдкрд░рд┐рдгрд╛рдо рд╕рд┐рд░реНрдл рдПрдХ рдФрд░ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ!
 > import Control.Applicative > let foo = fmap (+3) (+2) > foo 10 15 


рддреЛ рдлрд╝рдВрдХреНрд╢рдВрд╕ рднреА рдлрд╝рдВрдХреНрд╢рдирд▓ рд╣реИрдВ!
 instance Functor ((->) r) where fmap fg = f . g 


рдФрд░ рдЬрдм рдЖрдк рдХрд┐рд╕реА рдлрдВрдХреНрд╢рди рдореЗрдВ fmap , рддреЛ рдЖрдк рдмрд╕ рдлрдВрдХреНрд╢рди fmap рдХрд░рддреЗ рд╣реИрдВ!

рдПрдкреНрд▓рд╛рдЗрдб рдлрдВрдХреНрд╢рдирд▓


рдЕрдЧрд▓рд╛ рд╕реНрддрд░ рдПрдкреНрд▓рд╛рдЗрдб рдлрдВрдХреНрд╢рдирд▓рд░реНрд╕ рд╣реИред рдЙрдирдХреЗ рд╕рд╛рде, рд╣рдорд╛рд░рд╛ рдореВрд▓реНрдп рдЕрднреА рднреА рд╕рдВрджрд░реНрдн рдореЗрдВ рдкреИрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдареАрдХ рдЙрд╕реА рддрд░рд╣ рдЬреИрд╕реЗ рдХрд┐ рдлрдВрдХреНрд╢рдирд▓рд░реНрд╕):


рд▓реЗрдХрд┐рди рдЕрдм рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдп рдХреЛ рд╕рдВрджрд░реНрдн рдореЗрдВ рдкреИрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ!


рдЕрд╣рд╛! рдЪрд▓реЛ рдЗрд╕ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рддреЗ рд╣реИрдВред рдПрдкреНрд▓рд╛рдЗрдб рдлрдВрдХреНрд╢рдирд▓рд░реНрд╕ рдардЧ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИрдВред Control.Applicative рдПрдХ <*> рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рд╕рдВрджрд░реНрдн рдореЗрдВ рдкреИрдХ рдХрд┐рдП рдЧрдП рдорд╛рди рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдкреИрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдлрд╝рдВрдХреНрд╢рди рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд░реЗрдВ:


рдпрд╛рдиреА
 Just (+3) <*> Just 2 == Just 5 


<*> рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рд░реЛрдЪрдХ рд╕реНрдерд┐рддрд┐рдпрд╛рдВ рдмрди рд╕рдХрддреА рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
 > [(*2), (+3)] <*> [1, 2, 3] [2, 4, 6, 4, 5, 6] 




рдФрд░ рдпрд╣рд╛рдБ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬреЛ рдЖрдк рдРрдкреНрд▓рд┐рдХреЗрдЯрд░ рдлрд╝рдВрдХреНрд╢рдирд▓рд░реНрд╕ рдХреА рдорджрдж рд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдк рд╕рд╛рдорд╛рдиреНрдп рд▓реЛрдЧреЛрдВ рдХреА рдорджрдж рд╕реЗ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдЖрдк рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рджреЛ рдкреИрдХреНрдб рдорд╛рдиреЛрдВ рдХреЛ рджреЛ рдкреИрдХ рдорд╛рди рд▓реЗрддрд╛ рд╣реИ?
 > (+) <$> (Just 5) Just (+5) > Just (+5) <$> (Just 4) ???         JUST 


рдЖрд╡реЗрджрдХ
 > (+) <$> (Just 5) Just (+5) > Just (+5) <*> (Just 3) Just 8 


Functor рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ Functor рдПрдХ рддрд░рдл рдзрдХреЗрд▓ рджреЗрддрд╛ рд╣реИред "рдмрдбрд╝реЗ рд▓реЛрдЧ рдХрд┐рд╕реА рднреА рддрд░реНрдХ рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ," рд╡реЗ рдХрд╣рддреЗ рд╣реИрдВред " <$> рдФрд░ <*> рд╕рд╛рде рд╕рд╢рд╕реНрддреНрд░, рдореИрдВ рдХрд┐рд╕реА рднреА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓реЗ рд╕рдХрддрд╛ рд╣реВрдВ рдЬреЛ рдХрд┐рд╕реА рднреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЕрдирдкреИрдХ рддрд░реНрдХреЛрдВ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИред рдлрд┐рд░ рдореИрдВ рдЙрд╕реЗ рд╕рднреА рдкреИрдХреНрдб рд╡реИрд▓реНрдпреВ рджреВрдВрдЧрд╛ рдФрд░ рдкреИрдХреНрдб рд░рд┐рдЬрд▓реНрдЯ рджреВрдВрдЧрд╛! BWAHAHAHAHAHA! "
 > (*) <$> Just 5 <*> Just 3 Just 15 



рдЖрд╡реЗрджрдХ рдлрд╝рдирдХрд╛рд░ рджреЗрдЦрддрд╛ рд╣реИ рдХрд┐ рдирд┐рдпрдорд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреИрд╕реЗ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ

рдФрд░ рд╣рд╛рдБ! рдПрдХ liftA2 рдП liftA2 рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рд╕рдорд╛рди рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ:
 > liftA2 (*) (Just 5) (Just 3) Just 15 


рдЗрдХрд╛рдИ


рд╕рд╛рдзреБ рдХреИрд╕реЗ рд╕реАрдЦреЗрдВ:
  1. рдХрдВрдкреНрдпреВрдЯрд░ рд╕рд╛рдЗрдВрд╕ рдореЗрдВ рдкреАрдПрдЪрдбреА рдХреНрд░рд╕реНрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ
  2. рдЙрдиреНрд╣реЗрдВ nafig рдлреЗрдВрдХ рджреЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдЦрдВрдб рдХреЛ рдкрдврд╝рддреЗ рд╕рдордп рдЖрдкрдХреЛ рдЙрдирдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреА!

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


рдЖрд╡реЗрджрдХ рдлрдВрдХреНрд╢рдирд▓ рдкреИрдХреНрдб рдлрдВрдХреНрд╢рди рдХреЛ рдкреИрдХреНрдб рд╡реИрд▓реНрдпреВ рдкрд░ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ:


рдореЛрдирд╛рдб рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ рдкреИрдХ рдореВрд▓реНрдп рдХреЛ рдПрдХ рдкреИрдХ рдореВрд▓реНрдп рдкрд░ рд▓реМрдЯрд╛рддрд╛ рд╣реИ ред рдореЛрдирд╛рдбреНрд╕ рдХрд╛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ >>= (рдЙрдЪреНрдЪрд╛рд░рдг "рдмрд╛рдЗрдВрдбрд┐рдВрдЧ" ( рдмрд╛рдЗрдВрдб )), рдЬреЛ рдЖрдкрдХреЛ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ: рд╣рдорд╛рд░рд╛ рдЕрдЪреНрдЫрд╛ рдкреБрд░рд╛рдирд╛ Maybe рдПрдХ рд╕рдиреНрдпрд╛рд╕реА рд╣реИ:

рдмрд╕ рдПрдХ рдЭреВрд▓рддрд╛ рд╣реБрдЖ рдореЛрдирд╛рдб

рдорд╛рди рд▓реЗрдВ рдХрд┐ рдПрдХ рдРрд╕рд╛ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдХреЗрд╡рд▓ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:
 half x = if even x then Just (x `div` 2) else Nothing 




рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рд╣рдо рдЙрд╕реЗ рдкреИрдХреНрдб рд╡реИрд▓реНрдпреВ рдЦрд┐рд▓рд╛рдПрдВ?


рд╣рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреИрдХ рдореВрд▓реНрдп рдХреЛ рдзрдХреЗрд▓рдиреЗ рдХреЗ рд▓рд┐рдП >>= рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпреЗ рд╣реИ рдлреЛрдЯреЛ >>=


рдФрд░ рдпрд╣рд╛рдБ рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:
 > Just 3 >>= half Nothing > Just 4 >>= half Just 2 > Nothing >>= half Nothing 


рдЕрдВрджрд░ рдХреНрдпрд╛ рдЪрд▓ рд░рд╣рд╛ рд╣реИ? Monad рдПрдХ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреА рдХрдХреНрд╖рд╛ рд╣реИред рдпрд╣рд╛рдБ рдПрдХ рдЖрдВрд╢рд┐рдХ рдкрд░рд┐рднрд╛рд╖рд╛ рд╣реИ:
 class Monad m where (>>=) :: ma -> (a -> mb) -> mb 


рдЬрд╣рд╛рдБ >>= :


рддреЛ Maybe рдПрдХ рд╕рдиреНрдпрд╛рд╕реА рд╣реИ:
 instance Monad Maybe where Nothing >>= func = Nothing Just val >>= func = func val 


рд▓реЗрдХрд┐рди рдЧрд░реАрдмреЛрдВ рдкрд░ рдХреНрдпрд╛ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреА рдЬрд╛ рд░рд╣реА рд╣реИ Just 3 !


рдпрджрд┐ рдЖрдк рдЗрдирдкреБрдЯ рдореЗрдВ Nothing рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЕрднреА рднреА рд╕рд░рд▓ рд╣реИ:


рдЖрдк рдХреЙрд▓ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рднреА рд▓рд┐рдВрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
 > Just 20 >>= half >>= half >>= half Nothing 





рдорд╕реНрдд рдЪреАрдЬрд╝! рдФрд░ рдЕрдм рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ Maybe рд╣реИ рдХрд┐ Functor , Monad рдФрд░ Monad рдПрдХ рдореЗрдВ Monad ред
рдЕрдм рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВ: IO monad:


рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдЗрд╕рдХреЗ рддреАрди рдХрд╛рд░реНрдпред getLine рдХреЛрдИ рддрд░реНрдХ рдирд╣реАрдВ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЗрдирдкреБрдЯ рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ:


 getLine :: IO String 


readFile рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ (рдлрд╝рд╛рдЗрд▓ рдирд╛рдо) рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЙрд╕рдХреА рд╕рд╛рдордЧреНрд░реА рд▓реМрдЯрд╛рддрд╛ рд╣реИ:


 readFile :: FilePath -> IO String 


putStrLn рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЙрд╕реЗ рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИ:


 putStrLn :: String -> IO () 


рд╕рднреА рддреАрди рдлрд╝рдВрдХреНрд╢рди рдирд┐рдпрдорд┐рдд рдорд╛рди рд▓реЗрддреЗ рд╣реИрдВ (рдпрд╛ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдорд╛рди рдирд╣реАрдВ) рдФрд░ рдкреИрдХреНрдб рдорд╛рди рд▓реМрдЯрд╛рддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП рд╣рдо >>= рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдиреНрд╣реЗрдВ рдЪреЗрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ!


 getLine >>= readFile >>= putStrLn 


рдЕрд░реЗ рд╣рд╛рдБ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдореЛрдирд╛рдж рд╢реЛ рдХреЗ рд▓рд┐рдП рдЕрдЧреНрд░рд┐рдо рдкрдВрдХреНрддрд┐ рдХреЗ рдЯрд┐рдХрдЯ рд╣реИрдВ!
рд╣рд╛рд╕реНрдХреЗрд▓ рд╣рдореЗрдВ рдореЛрдирд╛рдбреНрд╕ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕рд┐рдВрдЯреИрдХреНрдЯрд┐рдХ рд╢реБрдЧрд░ рднреА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ do рдиреЛрдЯреЗрд╢рди рдХрд╣рд╛ рдЬрд╛рддрд╛ do :
 foo = do filename <- getLine contents <- readFile filename putStrLn contents 


рдирд┐рд╖реНрдХрд░реНрд╖


  1. рдПрдХ рдлрд╝рдВрдХреНрдЯрд░ рдПрдХ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬрд┐рд╕реЗ Functor рдкреНрд░рдХрд╛рд░ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
  2. рдПрдХ рдРрдкреНрд▓рд┐рдХреЗрдЯрд░ рдлрд╝рдВрдХреНрдЯрд░ рдПрдХ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИ, рдЬрд┐рд╕реЗ рдРрдкреНрд▓рд┐рдХреЗрдЯрд┐рд╡ рдЯрд╛рдЗрдк рдХреНрд▓рд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
  3. рдореЛрдирд╛рдб рдПрдХ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬрд┐рд╕реЗ Monad рдкреНрд░рдХрд╛рд░ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
  4. рд╢рд╛рдпрдж рд╕рднреА рддреАрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдПрдХ рдлрд╝рдирдХрд╛рд░, рдкреНрд░рдпреЛрдЬреНрдп рдлрд╝рдВрдХреНрдЯрд░ рдФрд░ рдореЛрдирд╛рдб рд╣реИ

рддреАрдиреЛрдВ рдореЗрдВ рдХреНрдпрд╛ рдЕрдВрддрд░ рд╣реИ?




рддреЛ, рдкреНрдпрд╛рд░реЗ рджреЛрд╕реНрддреЛрдВ (рдФрд░ рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЗрд╕ рдХреНрд╖рдг рддрдХ рд╣рдо рджреЛрд╕реНрдд рдмрди рдЧрдП рд╣реИрдВ), рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рд╕рднреА рд╕рд╣рдордд рд╣реЛрдВрдЧреЗ рдХрд┐ рднрд┐рдХреНрд╖реБ рд╕рд░рд▓ рдФрд░ рд╕реНрдорд╛рд░реНрдЯ рдЖрдИрдбреАрдИрдП (рдЯреАрдПрдо) рд╣реИрдВред рдФрд░ рдЕрдм, рд╣рдо рдЗрд╕ рдЧрд╛рдЗрдб рдХреЗ рд╕рд╛рде рдЧрд▓рд╛ рдЧреАрд▓рд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореЗрд▓ рдЧрд┐рдмреНрд╕рди рдХреЛ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдмреБрд▓рд╛рддреЗ рд╣реИрдВ рдФрд░ рдмреЛрддрд▓ рдХреЛ рдЦрддреНрдо рдХрд░рддреЗ рд╣реИрдВ? LYAH рдореЗрдВ рдореЛрдирдб рд╕реЗрдХреНрд╢рди рджреЗрдЦреЗрдВред рдРрд╕реА рдмрд╣реБрдд рд╕реА рдЪреАрдЬреЗрдВ рд╣реИрдВ рдЬрд┐рдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВрдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореАрд░рд╛рди рдиреЗ рдЗрд╕ рд╕рд╛рдордЧреНрд░реА рдХреЛ рдЧрд╣рд░рд╛ рдмрдирд╛рдиреЗ рдХрд╛ рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИред
рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рддреАрди рдЙрдкрдпреЛрдЧреА рдореЛрдирдбреНрд╕ ( рдЕрдиреБрд╡рд╛рдж ) рдореЗрдВ рдФрд░ рднреА рдореЛрдирдбреНрд╕ рдФрд░ рдЪрд┐рддреНрд░ рдорд┐рд▓ рд╕рдХрддреЗ рд╣реИрдВред

рдЕрдиреБрд╡рд╛рджрдХ рд╕реЗ:
рдореВрд▓ рд╕реЗ рд▓рд┐рдВрдХ рдХрд░реЗрдВ: http://adit.io/posts/2013-04-17-functors,_applicatives,_and_monads_in_pictures.html рдореИрдВ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд▓рд┐рдЦрддрд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рд╣рдмрд░ рдХреЙрдорд░рд╕ рдХреЗ рд╕рд╛рде url рдкрд░ рдХрд╕рдо рдЦрд╛рддрд╛ рд╣реИред
рдФрд░, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдореИрдВ рдЕрдиреБрд╡рд╛рдж рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдкреАрдПрдо рдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЖрднрд╛рд░реА рд░рд╣реВрдВрдЧрд╛ред

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


All Articles