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

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

рдХреНрдпрд╛ рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рдорд╛рд░реЛрд╣ рдХреЛ рд▓рд┐рдЦрдирд╛ рд╕рдВрднрд╡ рд╣реИ? рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ! рдФрд░ рд╕рд┐рд░реНрдл рдПрдХ рд▓рд╛рдЗрди!
рд▓реЛрдПрдм
loeb
рд╣рд╛рд╕реНрдХреЗрд▓ рдкрд░ рдЙрди рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдЬреЛ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдЖрдХрд░реНрд╖рдХ, рдкрд╛рдЧрд▓, рд╕рд░рд▓ рдФрд░ рдЬрдЯрд┐рд▓ рджрд┐рдЦрддреЗ рд╣реИрдВред
- рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ
- рдХрд╛рд░реНрдп рдХреЛ рд╕рдордЭрдирд╛ рдХрдард┐рди рд╣реИ
- рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ
- рдлрдВрдХреНрд╢рди рдПрдХреНрд╕рдкреНрд▓реЛрд╕рд┐рд╡ рд╣реИ
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рд╕реНрдорд╛рд░реНрдЯ рд▓рдЧ рд░рд╣рд╛ рд╣реИ? рдЖрдЗрдП рдЗрд╕реЗ рдмрджрд▓рддреЗ рд╣реИрдВ, рдЖрдкрдХреЛ
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 ]
рдорд╛рди рд▓реАрдЬрд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╕реВрдЪреА рд╣реИ
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
рдЪрд▓реЛ рдЗрд╕реЗ рдЪрд▓рд╛рддреЗ рд╣реИрдВ!
рдЙрддреНрдкрд╛рджрди рдореЗрдВ рд╣рдо рдкреНрд░рд╛рдкреНрдд:
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
рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП, рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЛ рдХреЗрд╡рд▓ рдкрд╛рдЧрд▓ рдмрдирд╛ рджреЗрдЧрд╛!
рдФрд░ рдирдП рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдЖрдк
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)
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ,
moeb
fix
рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рд╣реИред
рдРрд╕реЗ рдЕрдиреНрдп рдХрд╛рд░реНрдп рд╣реИрдВ рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ
moeb
рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐
traverse
рдФрд░
foldMap
, рд▓реЗрдХрд┐рди рдореИрдВ рдЕрднреА рднреА рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдЙрдкрдпреЛрдЧреА рд╣реИред