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

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

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
рдЗрдХрд╛рдИ
рд╕рд╛рдзреБ рдХреИрд╕реЗ рд╕реАрдЦреЗрдВ:
- рдХрдВрдкреНрдпреВрдЯрд░ рд╕рд╛рдЗрдВрд╕ рдореЗрдВ рдкреАрдПрдЪрдбреА рдХреНрд░рд╕реНрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ
- рдЙрдиреНрд╣реЗрдВ 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
рдирд┐рд╖реНрдХрд░реНрд╖
- рдПрдХ рдлрд╝рдВрдХреНрдЯрд░ рдПрдХ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬрд┐рд╕реЗ
Functor
рдкреНрд░рдХрд╛рд░ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдПрдХ рдРрдкреНрд▓рд┐рдХреЗрдЯрд░ рдлрд╝рдВрдХреНрдЯрд░ рдПрдХ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИ, рдЬрд┐рд╕реЗ рдРрдкреНрд▓рд┐рдХреЗрдЯрд┐рд╡ рдЯрд╛рдЗрдк рдХреНрд▓рд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
- рдореЛрдирд╛рдб рдПрдХ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬрд┐рд╕реЗ
Monad
рдкреНрд░рдХрд╛рд░ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред - рд╢рд╛рдпрдж рд╕рднреА рддреАрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдПрдХ рдлрд╝рдирдХрд╛рд░, рдкреНрд░рдпреЛрдЬреНрдп рдлрд╝рдВрдХреНрдЯрд░ рдФрд░ рдореЛрдирд╛рдб рд╣реИ
рддреАрдиреЛрдВ рдореЗрдВ рдХреНрдпрд╛ рдЕрдВрддрд░ рд╣реИ?

- functor : рдЖрдк
fmap
рдпрд╛ <$>
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкреИрдХ рдХрд┐рдП рдЧрдП рдорд╛рди рдкрд░ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ liftA
: рдЖрдк рдкреИрдХ рдХрд┐рдП рдЧрдП рдлрд╝рдВрдХреНрд╢рди рдХреЛ <*>
рдпрд╛ liftA
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреИрдХ рдХрд┐рдП рдЧрдП рдорд╛рди рдкрд░ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ- рдореЛрдирд╛рдж : рдЖрдк рдПрдХ рдРрд╕реЗ рдлрдВрдХреНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдкреИрдХреНрдб рд╡реИрд▓реНрдпреВ рдХреЛ рдкреИрдХ рдХрд░рдХреЗ
>>=
рдпрд╛ liftM
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ liftM
рддреЛ, рдкреНрдпрд╛рд░реЗ рджреЛрд╕реНрддреЛрдВ (рдФрд░ рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЗрд╕ рдХреНрд╖рдг рддрдХ рд╣рдо рджреЛрд╕реНрдд рдмрди рдЧрдП рд╣реИрдВ), рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рд╕рднреА рд╕рд╣рдордд рд╣реЛрдВрдЧреЗ рдХрд┐ рднрд┐рдХреНрд╖реБ рд╕рд░рд▓ рдФрд░ рд╕реНрдорд╛рд░реНрдЯ рдЖрдИрдбреАрдИрдП (рдЯреАрдПрдо) рд╣реИрдВред рдФрд░ рдЕрдм, рд╣рдо рдЗрд╕ рдЧрд╛рдЗрдб рдХреЗ рд╕рд╛рде рдЧрд▓рд╛ рдЧреАрд▓рд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореЗрд▓ рдЧрд┐рдмреНрд╕рди рдХреЛ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдмреБрд▓рд╛рддреЗ рд╣реИрдВ рдФрд░ рдмреЛрддрд▓ рдХреЛ рдЦрддреНрдо рдХрд░рддреЗ рд╣реИрдВ? LYAH рдореЗрдВ рдореЛрдирдб
рд╕реЗрдХреНрд╢рди рджреЗрдЦреЗрдВред рдРрд╕реА рдмрд╣реБрдд рд╕реА рдЪреАрдЬреЗрдВ рд╣реИрдВ рдЬрд┐рдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВрдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореАрд░рд╛рди рдиреЗ рдЗрд╕ рд╕рд╛рдордЧреНрд░реА рдХреЛ рдЧрд╣рд░рд╛ рдмрдирд╛рдиреЗ рдХрд╛ рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ рдХрд╛рдо рдХрд┐рдпрд╛ рд╣реИред
рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐
рддреАрди рдЙрдкрдпреЛрдЧреА рдореЛрдирдбреНрд╕ (
рдЕрдиреБрд╡рд╛рдж ) рдореЗрдВ рдФрд░ рднреА рдореЛрдирдбреНрд╕ рдФрд░ рдЪрд┐рддреНрд░ рдорд┐рд▓ рд╕рдХрддреЗ рд╣реИрдВред
рдЕрдиреБрд╡рд╛рджрдХ рд╕реЗ:
рдореВрд▓ рд╕реЗ рд▓рд┐рдВрдХ рдХрд░реЗрдВ: http://adit.io/posts/2013-04-17-functors,_applicatives,_and_monads_in_pictures.html рдореИрдВ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд▓рд┐рдЦрддрд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рд╣рдмрд░ рдХреЙрдорд░рд╕ рдХреЗ рд╕рд╛рде url рдкрд░ рдХрд╕рдо рдЦрд╛рддрд╛ рд╣реИред
рдФрд░, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдореИрдВ рдЕрдиреБрд╡рд╛рдж рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдкреАрдПрдо рдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЖрднрд╛рд░реА рд░рд╣реВрдВрдЧрд╛ред