L├╢b рдФрд░ m├╢b: рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рдЕрдЬреАрдм рд▓реВрдк

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

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

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

рдЕрдЬреАрдм рдЫреЛрд░реЛрдВ рдиреЗ рдЕрдкрдиреА рд╕реБрдВрджрд░рддрд╛ рд╕реЗ рд▓реЛрдЧреЛрдВ рдХреЛ рдЙрддреНрд╕рд╛рд╣рд┐рдд рдХрд┐рдпрд╛ред рдФрд░ рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ рдЬрдм рдЖрдк рдЙрдиреНрд╣реЗрдВ рд╕рдмрд╕реЗ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ рдкрд╛рддреЗ рд╣реИрдВред рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рдЕрдЬреАрдм рдЫреЛрд░реЛрдВ рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдк рдХрд╛рд░реНрдп рд▓рд┐рдЦреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред

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

рдХрд┐рд╕реА рднреА рд╕рд┐рджреНрдзрд╛рдВрдд рдореЗрдВ рдкреАрдиреЛ рдХреА рд╕реНрд╡рдпрдВрд╕рд┐рджреНрдзрддрд╛ (рдкреНрд░рд╛рдХреГрддрд┐рдХ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реНрд╡рдпрдВрд╕рд┐рджреНрдзрддрд╛) рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдХрд┐рд╕реА рднреА рдХрдерди рдХреЗ рд▓рд┐рдП P рдХрд╛ рдХрдерди "рдпрджрд┐ P рдкреНрд░рдорд╛рдгрд┐рдд рд╣реИ, рддреЛ P рд╕рддреНрдп рд╣реИ" рддрднреА рд╕рдВрднрд╡ рд╣реИ рдЬрдм рдХрдерди P рд╕реНрд╡рдпрдВ рд╕рд┐рджреНрдз рд╣реЛред

рдХрдерди рдХреА рдпрд╣ рд╕рд╛рд░реА рдЬрдЯрд┐рд▓рддрд╛ рдкреНрд░рддреАрдХрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рд▓рд┐рдЦреА рдЬрд╛ рд╕рдХрддреА рд╣реИ:


рдХреНрдпрд╛ рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рдорд╛рд░реЛрд╣ рдХреЛ рд▓рд┐рдЦрдирд╛ рд╕рдВрднрд╡ рд╣реИ? рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ! рдФрд░ рд╕рд┐рд░реНрдл рдПрдХ рд▓рд╛рдЗрди!

рд▓реЛрдПрдм


loeb рд╣рд╛рд╕реНрдХреЗрд▓ рдкрд░ рдЙрди рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдЬреЛ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдЖрдХрд░реНрд╖рдХ, рдкрд╛рдЧрд▓, рд╕рд░рд▓ рдФрд░ рдЬрдЯрд┐рд▓ рджрд┐рдЦрддреЗ рд╣реИрдВред
  1. рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ
  2. рдХрд╛рд░реНрдп рдХреЛ рд╕рдордЭрдирд╛ рдХрдард┐рди рд╣реИ
  3. рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ
  4. рдлрдВрдХреНрд╢рди рдПрдХреНрд╕рдкреНрд▓реЛрд╕рд┐рд╡ рд╣реИ

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди

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

 loeb :: Functor f => f (fa -> a) -> fa loeb x = go where go = fmap ($ go) x 

рд╕рднреА рд╕реБрдВрджрд░рддрд╛ рдорд╣рд╕реВрд╕ рдХрд░реЛ! рдлрд┐рд░ рдЕрдЧрд▓реЗ рдЕрдиреБрднрд╛рдЧ рдкрд░ рдЬрд╛рдПрдВред
рдирд╣реАрдВ? рд╣рдореНрдо ... рд╢рд╛рдпрдж рдЖрдк рд╣рд╛рд╕реНрдХреЗрд▓ рдХреЛ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ? рдлрд┐рд░ рдореИрдВ рдФрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрддрд╛рдКрдВрдЧрд╛ред
рдХреБрдЫ рдЪрддреБрд░ рд▓реЛрдЧ рдкреВрдЫреЗрдВрдЧреЗ рдХрд┐ рджреЛ рд▓рд╛рдЗрдиреЗрдВ рдХреНрдпреЛрдВ рд╣реИрдВ, рдФрд░ рдПрдХ рдирд╣реАрдВ, рдФрд░ рд╡реЗ рд╕рд╣реА рд╣реЛрдВрдЧреЗред рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдПрдХ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╣реИ: рдПрдХ рдШреЛрд╖рдгрд╛, рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде, рдлрд╝рдВрдХреНрд╢рди рдХрд┐рддрдиреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рд▓рд╛рдЗрди рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИ - рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдирд╣реАрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ рджреБрднрд╛рд╖рд┐рдпрд╛ (рдФрд░ рд╕рдВрдХрд▓рдХ) рд╕реНрд╡рдпрдВ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдЧрд╛:
 loeb :: Functor f => f (fa -> a) -> fa 

рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЛ рддреАрди рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдкрд╣рд▓реЗ рд╣рдо рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдирд╛рдо рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдлрд┐рд░ рд╣рдо рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдкреНрд░рдХрд╛рд░ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, :: , рдлрд┐рд░ рдмреЛрд▓реНрдб рдПрд░реЛ ( => ) рдХреЗ рд▓рд┐рдП рд╣рдо рдорд╛рдкрджрдВрдбреЛрдВ рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз рд▓рд┐рдЦрддреЗ рд╣реИрдВ - рдореИрдВ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдиреАрдЪреЗ рддрдХ рд╕рдордЭрд╛рдКрдВрдЧрд╛ред рдФрд░ рдЕрдВрдд рдореЗрдВ - рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдкреНрд░рдХрд╛рд░:
f (fa -> a) -> fa , рджреЗрдЦреЗрдВ рдХрд┐ Loeb рдХреА рдкреНрд░рдореЗрдп рдХреЗ рд▓рд┐рдП рд░рд┐рдХреЙрд░реНрдб рдХрд┐рддрдирд╛ рдХрд░реАрдм рд╣реИ: - рд╣рд╛рдБ, рдПрдХ рд╕реЗ рдПрдХ!
рдореИрдВ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛!

рдпрд╣ рд╕рдордЭрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд╛ рдХреНрдпрд╛ рдЕрд░реНрде рд╣реИ, рдЬрдм рддрдХ рд╣рдо рд╕реНрд╡рдпрдВ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рддреЗ рд╣реИрдВ, рдЪрд▓реЛ рдЙрд╕ рдкрд░ рд╕рдордп рдмрд░реНрдмрд╛рдж рди рдХрд░реЗрдВ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ 3 рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рд▓рд┐рдЦреЗрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдХреЛрдИ рднреА рд╕рднреНрдп рд╣рд╛рд╕реНрдХреЗрд▓рд┐рд╕реНрдЯ рдХрд░реЗрдЧрд╛:
 loeb :: Functor f => f (fa -> a) -> fa loeb x = go where go = fmap ($ go) x 

рдпрд╣рд╛рдВ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рд╡рд╣ рд╢рдмреНрдж where рдПрдХ рд╕реЗрд╡рд╛ рд╢рдмреНрдж рд╣реИ рдФрд░ рдЖрдВрддрд░рд┐рдХ рдХрд╛рд░реНрдп рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛рддрд╛ рд╣реИред

рдХреИрд╕реЗ рдкрдврд╝реЗрдВ? ... рдЕрд░реЗ рд╣рд╛рдБ, рдореБрдЭреЗ рдХрд╣рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рдХреЛрдИ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЛрд╖реНрдардХ рдирд╣реАрдВ рд╣реИрдВ, рдФрд░ рдЬрд╣рд╛рдВ рдЕрдзрд┐рдХрд╛рдВрд╢ рднрд╛рд╖рд╛рдПрдВ рд▓рд┐рдЦреЗрдВрдЧреЗ
f (x, y, z) = ... , рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рд╡реЗ рдХреЗрд╡рд▓ fxyz = ...

рдпрд╣ рдХреЛрдб рд╕реЗ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ loeb рдлрд╝рдВрдХреНрд╢рди рдПрдХ рддрд░реНрдХ рдХрд╛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдФрд░ рдЗрд╕реЗ go рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ go рд╣реИред

рдлрдВрдХреНрд╢рди рдлрд╝рдВрдХреНрд╢рди рдХреЛ fmap рдФрд░ fmap рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред fmap рдлрд╝рдВрдХреНрд╢рди рд╕реНрд╡рдпрдВ рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП map рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рд╣реИ рдФрд░ рдЗрд╕реЗ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

 class Functor f where fmap :: (a -> b) -> fa -> fb 

рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдШреЛрд╖рдгрд╛ рд╣реИред рдУрдУрдкреА рдХрдХреНрд╖рд╛рдПрдВ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдХреЛ рд╕рдордЭрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рд╕рд┐рд░реНрдл рдпрд╣ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ f , fmap рд╕рдорд╛рд░реЛрд╣ рдореЗрдВ рдмрд╣реБрд░реВрдкреА рд╣реЛрдЧрд╛ред
рддреЛ, рдЖрдЗрдП рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЛ рдзреНрдпрд╛рди рд╕реЗ рджреЗрдЦреЗрдВ рдХрд┐ рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИред
рдпрд╣ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ fmap рдлрдВрдХреНрд╢рди рджреЛ рддрд░реНрдХреЛрдВ рдХрд╛ рдПрдХ рдлрдВрдХреНрд╢рди рд╣реИ - (a -> b) рдФрд░ fa , рдЖрдЙрдЯрдкреБрдЯ fb ред
рдпрд╣ рд╕рдордЭрдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ (a -> b) рдПрдХрд▓ рддрд░реНрдХ рдХрд╛ рдПрдХ рдХрд╛рд░реНрдп рд╣реИ рдЬреЛ рдХреБрдЫ рдЗрдирдкреБрдЯ рд▓реЗрддрд╛ рд╣реИ (рд╣рдо рдЖрдорддреМрд░ рдкрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВрдЧреЗ, рдпрд╣ рдХреЛрдИ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ - рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ, рд╕рдВрдЦреНрдпрд╛ рдпрд╛ рдлрд╝рд╛рдЗрд▓) рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рднреА рдпрд╛ рдкреНрд░рдХрд╛рд░ (рд╣рдо рдЗрд╕реЗ b рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реВрдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣ рдпрд╛рдж рд░рдЦрдирд╛ рдХрд┐ b рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╣реЛ рд╕рдХрддрд╛ a )ред
fa - a рдЖрдзрд╛рд░ рдкрд░ рдХреБрдЫ рдЬрдЯрд┐рд▓ рдореВрд▓реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдордЭрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЕрдЧрд░ рд╣рдо f(a) рд░реВрдк рдореЗрдВ рдкрдврд╝рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╕рдордЭрдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛
рдпрджрд┐ рдЖрдк рдЧрдгрд┐рдд рдореЗрдВ рдПрдХ рдлрд╝рдирдХрд╛рд░ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдЦреЛрд▓рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдПрдХ рдЕрджреНрднреБрдд рд╕рдорд╛рдирддрд╛ рджреЗрдЦреЗрдВрдЧреЗред
рдпрд╣реА рд╣реИ, рдЕрдЧрд░ рд╣рдо рдкреВрд░реА рд╕рдордЭ рд╕реЗ рд╡рд┐рдЪрд▓рд┐рдд рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рд╕рд╣рдЬ рдЬреНрдЮрд╛рди рдХреА рдУрд░ рдореБрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ fmap рдлрд╝рдВрдХреНрд╢рди рдлрд╝рдВрдХреНрд╢рди рдХреЛ f рдорд╛рдзреНрдпрдо рд╕реЗ рдорд╛рди рдкрд░ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдФрд░, рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╣ рдорд╛рдорд▓рд╛ рд╣реИред

рдЕрдкрдиреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдлрдВрдХреНрд╢рдирд▓рд░реНрд╕ рдХреА рдкреВрд░реА рд╢рдХреНрддрд┐ рдХреЛ рд╕рдордЭрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЖрдЗрдП рд╕реВрдЪрд┐рдпреЛрдВ рдХреЛ рджреЗрдЦреЗрдВ:
 instance Functor [] where fmap = map 

рдпрд╣ рдпрд╣рд╛рдВ рдЖрд╕рд╛рди рд╣реЛ рдЧрдпрд╛ - рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП, fmap рдлрд╝рдВрдХреНрд╢рди рдкреВрд░реА рддрд░рд╣ рд╕реЗ map рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рдорд╛рди рд╣реИред рдЦреИрд░, рд╕рднреА map рдкрд╣рд▓реЗ рд╕реЗ рд╣реА map рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЬрд╛рдирддреЗ рд╣реИрдВ, рдпрд╣ рд╕реВрдЪреА рдХреЗ рд╕рднреА рд╕рджрд╕реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╣реИред рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ, рдЗрд╕реЗ рдмрд╣реБрдд рд╕рд░рд▓рддрд╛ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
 map :: (a -> b) -> [a] -> [b] map _ [] = [] map f (x:xs) = fx : map f xs 

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

рдлреЗрдореНрдк = рдореИрдк рдХреНрдпреЛрдВ?
рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ map рдлрд╝рдВрдХреНрд╢рди рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИ рдХрд┐ fmap = map рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдП - рд╕рдм рдХреБрдЫ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ, [] f [] рдмрджрд▓реЗрдВ
 fmap :: (a -> b) -> [] a -> [] b 

рдЦреИрд░, рдпрд╣ рдЬреИрд╕рд╛ рд╣реИ рд╡реИрд╕рд╛ рд╣реА рд╣реИ
 fmap :: (a -> b) -> [a] -> [b] 



рдареАрдХ рд╣реИ, рдЪрд▓реЛ рдлрд┐рд░ рд╕реЗ рд╣рдорд╛рд░реА рдкрд░рд┐рднрд╛рд╖рд╛ рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВ:
 go = fmap ($ go) x 

рдбреЙрд▓рд░ рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд╛рд░реНрдп рд╣реИ? рдХреНрдпрд╛ рдпрд╣ рдЕрдВрдХрд▓ рд╕реИрдо рдХреЗ рдмрд┐рдирд╛ рд╕рдВрднрд╡ рд╣реИ? рдЦреИрд░, рдЖрдк, рдпрд╣ рд╢реБрджреНрдз рднрд╛рд╖рд╛ рд╣реИ! $ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдСрдкрд░реЗрдЯрд░ рдлрд╝рдВрдХреНрд╢рди рд╣реИ, рдЬрд┐рд╕реЗ рдПрдХ рдПрдкреЗрдХреНрдЯрд┐рд╡ рдлрд╝рдВрдХреНрд╢рди рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдкреНрд░рд╛рдердорд┐рдХ рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
 ($) :: (a -> b) -> a -> b f $ x = fx 

рдирд╣реАрдВ, рдпрд╣ рдЖрдкрдХреЛ рдкреНрд░рддреАрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХрд╛рд░реНрдп рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдХреНрд╕рд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЛрд╖реНрдардХ рдХреЗ рдмрдЬрд╛рдп рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдареАрдХ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ, рд╣рдо loeb рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ loeb рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдлрд┐рд░ рд╕реЗ loeb :
 loeb :: Functor f => f (fa -> a) -> fa loeb x = go where go = fmap (\z -> z go) x 

рд▓реИрдореНрдмреНрдбрд╛ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдкрдврд╝рдирд╛ рдЖрд╕рд╛рди рд╣реИ: \z -> z go рдЕрд░реНрде рд╣реИ рдХрд┐ рд▓реИрдореНрдмрдбрд╛ рдлрдВрдХреНрд╢рди (рд╕реНрд▓реИрд╢ рдЧреНрд░реАрдХ рд╡реЗрд░рд┐рдПрдмрд▓ рд▓реИрдореНрдмреНрдбрд╛ - ╬╗ рд╕реЗ рдорд┐рд▓рддрд╛-рдЬреБрд▓рддрд╛ рд╣реИ) рдПрдХ рд╡реЗрд░рд┐рдПрдмрд▓ z , рд╡реЗрд▓ рдФрд░ рдПрд░реЛ -> рд░реВрдк рдореЗрдВ рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ =

рдорд╣рд╛рди, рд╣рдо рдкрдврд╝рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдереЗ! рдЕрдм рдЗрд╕реЗ рд╕рдордЭрдирд╛ рдмрд╛рдХреА рд╣реИ!

loeb рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ?



рд▓рдШреБ рд╕рдВрд╕реНрдХрд░рдг: loeb рдкрд░рд┐рдгрд╛рдо рдХреЛ рдЦреБрдж рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рдЖрдк рдкрд╣рд▓реА рдмрд╛рд░ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реБрдирддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЙрд╕ рд╕рдордп рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдкрд╛рдЧрд▓рдкрди рд╣реИред

рд╡рд┐рд╕реНрддреГрдд рд╕рдВрд╕реНрдХрд░рдг: loeb рдЙрдкрдпреЛрдЧ loeb рдХрд░реЗрдВ? рдпрд╣ рдХрд╣рд╛рдБ рдЙрдкрдпреЛрдЧреА рд╣реИ? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рд╕реВрдЪреА рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдкреНрд░реЗрдбрд╢реАрдЯ (рдЬреИрд╕реЗ рдПрдХреНрд╕реЗрд▓) рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ - []:
 xs :: [a] xs = [...] fs :: [[a] -> a] fs = [...] rs :: [a] rs = [ f xs | f <- fs ] -- r = f xs 

рдорд╛рди рд▓реАрдЬрд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╕реВрдЪреА рд╣реИ xs :: [a] ред рдФрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИ рдЬреЛ рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рддреА рд╣реИ, fs :: [[a] -> a] ред рд╣рдо рд╕реВрдЪреА рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рд╣рдо рддрддреНрд╡реЛрдВ рдХреА рд╕реВрдЪреА рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ r рдХрд╛ рдПрдХ рдирдпрд╛ рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рд╕реВрдЪреА rs рдореЗрдВ рд╕рднреА r рдПрдХрддреНрд░ рдХрд░рддреЗ рд╣реИрдВред
 [ f xs | f <- fs ] 

рдпрд╣ рд╕рдордЭрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА - рд╕реВрдЪреА рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрд▓ рдореЗрдВ рд╣рдо рдорд╛рдиреЛрдВ рдХреА рд╕реВрдЪреА рдореЗрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди (рд╕реВрдЪреА рд╕реЗ) рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕реЗ рджрд╛рдИрдВ рд╕реЗ рдмрд╛рдИрдВ рдУрд░ рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЗрди рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╣рдордиреЗ xs рдорд╛рдиреЛрдВ рдХреА рд╕реВрдЪреА рдФрд░ fs рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреА рд╕реВрдЪреА рд╕реЗ rs рдЧрдгрдирд╛ рдХреАред

рдФрд░ рдЕрдм рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд - рдЖрдк xs рдореВрд▓реНрдпреЛрдВ рдХреА рд╕реВрдЪреА рдирд╣реАрдВ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдмрдЬрд╛рдп rs рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдлрд╝рдВрдХреНрд╢рди f рдХреЛ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рд╕реВрдЪреА рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рд╕реНрд╡рдпрдВ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ!
 fs :: [[a] -> a] fs = [...] rs :: [a] rs = [ f rs | f <- fs ] 

рдмреЗрд╢рдХ, рдпрд╣ рд╕рдм рдЕрддреНрдпрдзрд┐рдХ рдЖрд▓рд╕реНрдп рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ rs рдХреА рдЧрдгрдирд╛ рд╕реНрд╡рдпрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдХреА рдЬрд╛рддреА рд╣реИред рдЖрдк fs рдХреА рдЕрдкрдиреА рдкрд░рд┐рднрд╛рд╖рд╛ рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рджреЛрдиреЛрдВ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд╡реЗ рдмрд╕ rs рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реЛрдВрдЧреЗ:
 rs fs = [ f (rs fs) | f <- fs ] 

рдпрджрд┐ рдЖрдк рдмрд╛рд░реАрдХреА рд╕реЗ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рд╕реВрдЪрд┐рдпрд╛рдБ rs = loeb

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

loeb

рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЬреЛ рдЖрдкрдХреЛ рдпрд╣ рд╕рдордЭрдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ рдХрд┐ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд░реЗрдВ:
 fs = [ const 1 , succ . (!! 0) , succ . (!! 1) , succ . (!! 2) ] 

рдпрд╣рд╛рдБ const a _ = a рджреЛ рдЪрд░ рдХрд╛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рд╣рдореЗрд╢рд╛ рдкрд╣рд▓реЗ рдХрд╛ рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИ, succ x = inc рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП succ x = inc рд╡реГрджреНрдзрд┐ рд╣реИ (рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ, рдпрд╣ рдХрд┐рд╕реА рднреА рдЧрдгрдирд╛ рдХрд┐рдП рдЧрдП рдорд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╡реЗрддрди рд╡реГрджреНрдзрд┐ рдХрд╛ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рд╣реИ), (!!) рд╕реВрдЪреА рд╕реЗ n рддрддреНрд╡ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИред , (.) - 2 рдХрд╛рд░реНрдпреЛрдВ рдХреА рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╕рдВрд░рдЪрдирд╛, рдкрд╣рд▓реЗ рджрд╛рдПрдВ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреА рд╣реИ, рдлрд┐рд░ рдмрд╛рдПрдВ, рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкрд╣рд▓реЗ рд╕реВрдЪреА рд╕реЗ рдЖрдЗрдЯрдо рдХреЛ рдЦреАрдВрдЪрддреА рд╣реИ, рдлрд┐рд░ рд╡реЗрддрди рд╡реГрджреНрдзрд┐ред

рдпрд╣рд╛рдВ рд╣рдордиреЗ рдкрд┐рдЫрд▓реЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рддрддреНрд╡реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рд╣реИред const 1 рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓рд╛ рддрддреНрд╡ рд╣реИ, рдФрд░ рдпрд╣ рд╣рдореЗрд╢рд╛ 1 рд╡рд╛рдкрд╕ рдЖрдПрдЧрд╛, рдЙрд╕рдХреЗ рдмрд╛рдж рд╣рдо рджреВрд╕рд░реЗ рддрддреНрд╡ рдХрд╛ рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - succ . (!! 0) succ . (!! 0) , рдФрд░ рдЖрдЧреЗ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рд╕рд╛рде - рддреАрд╕рд░рд╛, рдЪреМрдерд╛ рдФрд░ рдкрд╛рдВрдЪрд╡рд╛рдВред
 > loeb fs [1,2,3,4] 


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

 fs = [ succ . (!! 1) , succ . (!! 3) , succ . (!! 0) , const 1 ] > loeb fs [3,2,4,1] 

рд╕рдЪ рдПрдХ рд╕реНрдкреНрд░реЗрдбрд╢реАрдЯ рдХреА рддрд░рд╣ рд▓рдЧ рд░рд╣рд╛ рд╣реИ? рд╕реЗрд▓ рдореЗрдВ рдПрдХ рдорд╛рди рдЬреНрдЮрд╛рдд рд╣реИ, рдФрд░ рдмрд╛рдХреА рдХрд┐рд╕реА рддрд░рд╣ рдПрдХ рджреВрд╕рд░реЗ рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИрдВред рдЬрдм рдЧрдгрдирд╛ рд╕рдорд╛рдкреНрдд рд╣реЛрддреА рд╣реИ, рддреЛ рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрд▓ рдХрд╛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдореВрд▓реНрдп рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдмрд┐рдВрджреБ рдХреЙрдореНрдмрд┐рдиреЗрдЯрд░ рдХреЗ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИред

рд╕реНрдкреНрд░реЗрдбрд╢реАрдЯреНрд╕!


рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдПрдХ рдЖрдпрд╛рдореА рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд╕рдорд╛рди рд╣реИред рд▓реЗрдХрд┐рди рдЖрдк рдЕрдиреНрдп рдлрдВрдХреНрд╢рдВрд╕ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛, рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рдХрд░реАрдм рд╣реИрдВ!

 import Data.Array import Data.List import Control.Monad import Text.Printf loeb :: Functor f => f (fa -> a) -> fa loeb x = go where go = fmap ($ go) x --   e = val 0 --     val = const -- ,   (10 %)    vat ix = (* 0.1) . (! ix) --    sum' ixs = \arr -> foldl' (\acc ix -> acc + arr ! ix) 0 ixs spreadsheet = listArray ((0,0), (4,4)) -- Prices | VAT | Effective prices + total [ val 1, vat (0,0), sum' [(0,i) | i <- [0..1]], e, e , val 3, vat (1,0), sum' [(1,i) | i <- [0..1]], e, e , val 5, vat (2,0), sum' [(2,i) | i <- [0..1]], e, e , val 2, vat (3,0), sum' [(3,i) | i <- [0..1]], e, e , e, e, sum' [(i,2) | i <- [0..3]], e, e ] printArr :: Array (Int, Int) Double -> IO () printArr arr = forM_ [0..4] $ \i -> do forM_ [0..4] $ \j -> printf "%4.1f " (arr ! (i,j)) printf "\n" main = printArr $ loeb spreadsheet 

рдЪрд▓реЛ рдЗрд╕реЗ рдЪрд▓рд╛рддреЗ рд╣реИрдВ!
рдЙрддреНрдкрд╛рджрди рдореЗрдВ рд╣рдо рдкреНрд░рд╛рдкреНрдд:
  1.0 0.1 1.1 0.0 0.0 3.0 0.3 3.3 0.0 0.0 5.0 0.5 5.5 0.0 0.0 2.0 0.2 2.2 0.0 0.0 0.0 0.0 12.1 0.0 0.0 

рдЬрд╣рд╛рдВ рдкрд╣рд▓реЗ рдШреБрдЯрдиреЗ рдореЗрдВ рд╣рдорд╛рд░реЗ рдореВрд▓реНрдп рд╣реИрдВ ( val рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ), рджреВрд╕рд░реЗ рдХреЙрд▓рдо рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдмрд╛рдИрдВ рдУрд░ рдЬреЛ рдХреБрдЫ рднреА рд╣реИ, рдЙрд╕рдХрд╛ рдЯреИрдХреНрд╕ рд╣реИ, рддреАрд╕рд░реЗ рдХреЙрд▓рдо рдореЗрдВ рдкреНрд░рднрд╛рд╡реА рдореВрд▓реНрдп рд╣реИ, рдФрд░ рдиреАрдЪреЗ рд╕рднреА рдкреНрд░рднрд╛рд╡реА рдХреАрдорддреЛрдВ рдХреА рдХреБрд▓ рд░рд╛рд╢рд┐ рд╣реИред рдЕрдм рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдСрд░реНрдбрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕рдм рдХреБрдЫ рдЦрд░реАрдж рд╕рдХрддреЗ рд╣реИрдВ! рдЬрд╛рджреВ! :-)

moeb рдлрд╝рдВрдХреНрд╢рди



moeb loeb рдлрд╝рдВрдХреНрд╢рди рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдЧреЗрдо рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИ: рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рд╣рдо fmap рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП, рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЛ рдХреЗрд╡рд▓ рдкрд╛рдЧрд▓ рдмрдирд╛ рджреЗрдЧрд╛!
 -- [m]oeb = multi-loeb :-) moeb :: (((a -> b) -> b) -> c -> a) -> c -> a moeb fx = go where go = f ($ go) x 

рдФрд░ рдирдП рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдЖрдк loeb рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рд╕рд┐рд░реНрдл moeb рдХрд╛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓рд╛ moeb :
 loeb = moeb fmap 

рдФрд░ moeb рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдХреНрдпрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддрд╛рдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ?
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЛрдИ рдлрд╝рдВрдХреНрд╢рди рд╣реИ
 id :: a -> a id x = x 

рддрдм:
 moeb id x = id ($ moeb id x) x = ($ moeb id x) x = x (moeb id x) --    ,   fix -- fix f = f (fix f) fix = moeb id 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, moeb fix рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рд╣реИред

рдРрд╕реЗ рдЕрдиреНрдп рдХрд╛рд░реНрдп рд╣реИрдВ рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ moeb рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ traverse рдФрд░ foldMap , рд▓реЗрдХрд┐рди рдореИрдВ рдЕрднреА рднреА рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдЙрдкрдпреЛрдЧреА рд╣реИред

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


All Articles