рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐, "
рдлрд╝рдВрдХреНрдЯрд░ " рд╢рдмреНрдж рдХрд╛ рдЕрд░реНрде рд╡рд┐рднрд┐рдиреНрди рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЪреАрдЬреЗрдВ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
C ++ рдХреЛ рд▓реЗрдВ ред C ++ рдХреЗ рдХреМрд╢рд▓ рдореЗрдВ рдорд╣рд╛рд░рдд рд╣рд╛рд╕рд┐рд▓ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣рд░ рдХреЛрдИ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╡рд░реНрдЧ рдЬреЛ
operator()
рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдЙрд╕реЗ рдПрдХ рдлрд╝рдирдХрд╛рд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдм
рд╕реНрдЯреИрдВрдбрд░реНрдб ML рд▓реЗрдВ ред рдПрдордПрд▓ рдореЗрдВ, рдлрдВрдХреНрд╢рдирд▓рд░реНрд╕ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХрд╛ рдирдХреНрд╢рд╛ рдмрдирд╛рддреЗ рд╣реИрдВред рдЕрдм
рд╣рд╛рд╕реНрдХреЗрд▓ ред рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ, рдлрдВрдХреНрд╢рдирд▓рд░реНрд╕ рдХреЗрд╡рд▓ рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдХреЗ рдКрдкрд░ рдПрдХ рд╣реЛрдореЛрдореЛрд░реНрдлрд┐рдЬреНрдо рд╣реИрдВред рдФрд░
рдкреНрд░реЛрд▓реЙрдЧ рдореЗрдВ, рдПрдХ рдордЬрд╝рджреВрд░ рдХрд╛ рдорддрд▓рдм рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдПрдХ рдкрд░рдорд╛рдгреБ рд╣реИред рд╡реЗ рд╕рднреА рдЕрд▓рдЧ рд╣реИрдВред рдЖрдЗрдП рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдкрд░ рдПрдХ рдХрд░реАрдм рд╕реЗ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВред
рд╕реА ++ рдореЗрдВ рдлрд╝рдирдХрд╛рд░
C ++ рдореЗрдВ рдлрд╝рдВрдХреНрдЯрд░ "рдлрд╝рдВрдХреНрд╢рдирд▓
рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ " рдХреЗ рд▓рд┐рдП рдХрдо
рд╣реИрдВ ред рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╡рд╕реНрддреБ C ++ рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬрд┐рд╕рдореЗрдВ
operator()
рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рд╕реА ++ рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП
operator()
рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдорд┐рд▓рддрд╛ рд╣реИ рдЬреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд░рд╛рдЬреНрдп рдХреЛ рднреА рдкрдХрдбрд╝ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП
#include <iostream> #include <string> class SimpleFunctor { std::string name_; public: SimpleFunctor(const char *name) : name_(name) {} void operator()() { std::cout << "Oh, hello, " << name_ << endl; } }; int main() { SimpleFunctor sf("catonmat"); sf(); // "Oh, hello, catonmat" }
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдо
main
рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ
sf()
рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдБрдХрд┐
sf
рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐
SimpleFunctor
рд╡рд░реНрдЧ рдореЗрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП
operator()
рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдЕрдХреНрд╕рд░, C ++ рдореЗрдВ рдлрдВрдХреНрд╢рдирд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд┐рдзреЗрдп, рдЫрджреНрдо рдХреНрд▓реЛрдЬрд░, рдпрд╛ рдПрд╕рдЯреАрдПрд▓ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдореЗрдВ рддреБрд▓рдирд╛ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣рд╛рдБ рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг рд╣реИред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкреВрд░реНрдгрд╛рдВрдХреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИ рдФрд░ рдЖрдк рд╕рднреА рдЕрд╡рдзрд┐рдпреЛрдВ рдХрд╛ рдпреЛрдЧ рдФрд░ рд╕рднреА рд╡рд┐рд╖рдореЛрдВ рдХрд╛ рдпреЛрдЧ рдЬреНрдЮрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдлрдВрдХреНрдЯрд░ рдФрд░
for_each
рд▓рд┐рдП рдЖрджрд░реНрд╢ рд╣реИред
#include <algorithm> #include <iostream> #include <list> class EvenOddFunctor { int even_; int odd_; public: EvenOddFunctor() : even_(0), odd_(0) {} void operator()(int x) { if (x%2 == 0) even_ += x; else odd_ += x; } int even_sum() const { return even_; } int odd_sum() const { return odd_; } }; int main() { EvenOddFunctor evenodd; int my_list[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; evenodd = std::for_each(my_list, my_list+sizeof(my_list)/sizeof(my_list[0]), evenodd); std::cout << " : " << evenodd.even_sum() << "\n"; std::cout << " : " << evenodd.odd_sum() << std::endl; // : // : 30 // : 25 }
рдпрд╣рд╛рдБ
EvenOddFunctor
рдЙрджрд╛рд╣рд░рдг
for_each
EvenOddFunctor
рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред for_each my_list рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдЖрдЗрдЯрдо рдкрд░ рдкреБрдирд░рд╛рд╡реГрддреНрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ рдлрд╝рдирдХрд╛рд░ рдХрд╣рддрд╛ рд╣реИред рдЙрд╕рдХреЗ рдмрд╛рдж, рдпрд╣
evenodd
рдХреА рдПрдХ рдкреНрд░рддрд┐ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕рдо рдФрд░ рд╡рд┐рд╖рдо рддрддреНрд╡реЛрдВ рдХрд╛ рдпреЛрдЧ рд╣реЛрддрд╛ рд╣реИред
Standart ML рдореЗрдВ рдлрд╝рдирдХрд╛рд░
OOP рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рддреИрдпрд╛рд░ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ: ML рдореЗрдВ рдлрдВрдХреНрд╢рдВрд╕ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИрдВред рдПрдордПрд▓ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдлрдВрдХреНрд╢рдВрд╕ рдПрдордПрд▓ рдореЙрдбреНрдпреВрд▓ рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИрдВ рдФрд░ рд╡реЗ рдЖрдкрдХреЛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреА рд░рдЪрдирд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдорд╛рди рд▓реЗрдВ рдХрд┐ рдЖрдк рдкреНрд▓рдЧ-рдЗрди рд╕рд┐рд╕реНрдЯрдо рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдФрд░ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╕рднреА рдкреНрд▓рдЧрдЗрдиреНрд╕ рдЖрд╡рд╢реНрдпрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВ, рдЬрд┐рд╕рдореЗрдВ рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓
perform
рдлрд╝рдВрдХреНрд╢рди рд╢рд╛рдорд┐рд▓ рд╣реИред рдПрдордПрд▓ рдореЗрдВ, рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреЗ рд▓рд┐рдП рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╕реЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛,
рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдкреНрд▓рдЧрдЗрди =
sig
рд╡реИрд▓ рдкреНрд░рджрд░реНрд╢рди : рдЗрдХрд╛рдИ -> рдЗрдХрд╛рдИ
рдЕрдВрдд ;
рдЕрдм рдЬрдм рд╣рдордиреЗ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлрд╝реЗрд╕ (рд╣рд╕реНрддрд╛рдХреНрд╖рд░) рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рд╣рдо рджреЛ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ,
LoudPlugin
рдФрд░
SilentPlugin
рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВред рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣реИ,
рд╕рдВрд░рдЪрдирд╛ рд▓рд╛рдЙрдбрдкреНрд▓рдЧрд┐рди :> рдкреНрд▓рдЧрд┐рди =
struct
рдордЬреЗрджрд╛рд░ рдкреНрд░рджрд░реНрд╢рди ( ) = рдкреНрд░рд┐рдВрдЯ "рдЬреЙрдм рд▓реЛрдб! \ n"
рдЕрдВрдд ;
рдФрд░ рд╕рд╛рдЗрд▓реЗрдВрдЯрдкреНрд▓рдЧрд┐рди,
рд╕рдВрд░рдЪрдирд╛ SilentPlugin :> рдкреНрд▓рдЧрдЗрди =
struct
рдордЬреЗрджрд╛рд░ рдкреНрд░рджрд░реНрд╢рди ( ) = рдкреНрд░рд┐рдВрдЯ "рдЪреБрдкрдЪрд╛рдк рдХрд╛рд░реНрдп рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдВ \ n"
рдЕрдВрдд ;
рдЕрдм рд╣рдо рдлрдВрдХреНрд╢рдирд▓рд░реНрд╕ рдХреЗ рдХрд░реАрдм рд╣реИрдВред ML рдореЗрдВ рдлрд╝рдВрдХреНрд╢рдВрд╕ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрд░рдЪрдирд╛рдПрдВ рд▓реЗрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐
Plugin
рдХреЛ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд╣реИ,
functor Performer ( P : Plugin ) =
struct
рдордЬреЗрджрд╛рд░ рдХрд╛рдо ( ) = рдкреАред рдкреНрд░рджрд░реНрд╢рди ( )
рдЕрдВрдд ;
рдпрд╣ рдлрд╝рдирдХрд╛рд░
Plugin
рдХреЛ
P
рдХреЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ
job
рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ
P
рдкреНрд▓рдЧрдЗрди рдХреЗ
perform
рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред
рдЕрдм рдЖрдЗрдП
Performer
functor рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рджреЗрдЦреЗрдВред рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдПрдХ рдлрд╝рдирдХрд╛рд░ рдПрдХ рд╕рдВрд░рдЪрдирд╛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ,
рд╕рдВрд░рдЪрдирд╛ LoudPerformer = рдХрд▓рд╛рдХрд╛рд░ ( LoudPlugin ) ;
рд╕рдВрд░рдЪрдирд╛ рд╕рд╛рдЗрд▓реЗрдВрдЯрдкреНрд░рдлреЙрд░реНрдорд░ = рдХрд▓рд╛рдХрд╛рд░ ( рд╕рд╛рдЗрд▓реЗрдВрдЯрдкреНрд▓рдЧрд┐рди ) ;
LoudPerformerред рдиреМрдХрд░реА ( ) ;
SilentPerformerред рдиреМрдХрд░реА ( ) ;
рдЗрд╕рдХреА рдХрдЯреМрддреА рдХреА рдЬрд╛рдПрдЧреА
рд╣рдо рд╕рдордп рд╕реЗ рдкрд╣рд▓реЗ рд╣реА рдкрд░рд╡рд╛рд╣ рдХрд░рддреЗ рд╣реИрдВ!
рдЪреБрдкрдЪрд╛рдк рдХрд╛рд░реНрдп рдХрд░реЗрдВ
рдпрд╣ рдорд╛рдирдХ рдПрдордПрд▓ рдлрдВрдХреНрд╢рдирд▓рд░реНрд╕ рдХрд╛ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рд╣реИред
рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рдлрдирдХрд╛рд░
рд╣рд╛рд╕реНрдХреЗрд▓ рдлрдВрдХреНрд╢рдирд▓рд░реНрд╕ рд╡рд╣реА рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдлрдВрдХреНрд╢рдирд▓рд░реНрд╕ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред рд╣рд╛рд╕реНрдХреЗрд▓ рдлрдВрдХреНрд╢рдирд▓рд░реНрд╕ рд╢реНрд░реЗрдгреА рд╕рд┐рджреНрдзрд╛рдВрдд рдореЗрдВ рдЧрдгрд┐рддреАрдп рдлрдВрдХреНрд╢рдВрд╕ рдХреА рдпрд╛рдж рддрд╛рдЬрд╛ рдХрд░рддреЗ рд╣реИрдВред рд╢реНрд░реЗрдгреА рд╕рд┐рджреНрдзрд╛рдВрдд рдореЗрдВ, рдлрд╝рдиреНрдХреНрдЯрд░ рдПрдл рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдХреЗ рдмреАрдЪ рдПрдХ рдорд╛рдирдЪрд┐рддреНрд░рдг рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рд╢реНрд░реЗрдгреА рдХреА рд╕рдВрд░рдЪрдирд╛ рд╕рдВрд░рдХреНрд╖рд┐рдд рд╣реИ рдпрд╛, рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдпрд╣ рджреЛ рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдХреЗ рдмреАрдЪ рдПрдХ рд╕рдорд░реВрдкрддрд╛ рд╣реИред
рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ, рдЗрд╕ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд░реНрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ,
рдХреНрд▓рд╛рд╕ рдлрдирдХрд╛рд░ рдЪ рдЬрд╣рд╛рдБ
fmap :: ( a -> b ) -> f a -> f b
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдордПрд▓ рдХреЛ рд╡рд╛рдкрд╕ рджреЗрдЦрдирд╛, рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╡рд░реНрдЧ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХреЗ рд╕рдорд╛рди рд╣реИ, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдпрд╣ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдСрдкрд░реЗрд╢рди рдХреЛ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ,
Functor
рди рдХреЗрд╡рд▓ рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛
Functor
рд╣реИ, рдмрд▓реНрдХрд┐ рдЯрд╛рдЗрдк
f
рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдкрд░ рднреАред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐
fmap
рд╡рд╣ рд╣реИ рдЬреЛ
fmap
рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓реЗрддрд╛ рд╣реИ (рдЯрд╛рдЗрдк
a
рдФрд░ рд░рд┐рдЯрд░реНрдирд┐рдВрдЧ рдкреНрд░рдХрд╛рд░
b
) рдФрд░ рдЯрд╛рдЗрдк
fa
(рдЯрд╛рдЗрдк
f
рдирд┐рд░реНрдорд╛рддрд╛ рд╕реЗ рдирд┐рд░реНрдорд┐рдд рдПрдХ рдкреНрд░рдХрд╛рд░) рдХрд╛ рдорд╛рди рдЯрд╛рдЗрдк
a
) рдФрд░ рдЯрд╛рдЗрдк
fb
рдХрд╛ рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИред
рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╡рд╣ рдХреНрдпрд╛ рдХрд░ рд░рд╣рд╛ рд╣реИ,
fmap
рдХреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ
fmap
рдЬреЛ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рдПрдХ рдСрдкрд░реЗрд╢рди рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред
рдлрдВрдХреНрд╢рдирд▓рд░реНрд╕ рдХрд╛ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдирд┐рдпрдорд┐рдд рд╕реВрдЪреА рдФрд░
map
рдлрд╝рдВрдХреНрд╢рди рд╣реИ, рдЬреЛ рд╕реВрдЪреА рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред
рдкреНрд░рд╕реНрддрд╛рд╡рдирд╛> рдирдХреНрд╢рд╛ (+1) [1,2,3,4,5]
[2,3,4,5,6]
рдЗрд╕ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ,
fmap
Functor
рдлрдВрдХреНрд╢рди
fmap
рд╕рд┐рд░реНрдл рдПрдХ
map
рдФрд░ рдЯрд╛рдЗрдк
f
рдХрд╛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░
[]
- рдПрдХ рд▓рд┐рд╕реНрдЯ рдЯрд╛рдЗрдк рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╣реИред рдЗрд╕рд▓рд┐рдП,
Functor
, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
рдЙрджрд╛рд╣рд░рдг рдлрд╝рдирдХрд╛рд░ [ ] рдЬрд╣рд╛рдБ
рдирдХреНрд╢рд╛ = рдирдХреНрд╢рд╛
рдЖрдЗрдП рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ
map
рдмрдЬрд╛рдп
fmap
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдЪ рд╣реИ,
рдкреНрд░рд╕реНрддрд╛рд╡рдирд╛> fmap (+1) [1,2,3,4,5]
[2,3,4,5,6]
рд▓реЗрдХрд┐рди рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдлрд╝рдВрдХреНрдЯрд░ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдирд╣реАрдВ рдХрд╣рддреА рд╣реИ! рдЗрд╕рд▓рд┐рдП, рдХрд┐рд╕реА рднреА рд╕рд╛рдорд╛рдиреНрдп рдлрд╝рдирдХрд╛рд░ рдХреЛ рдлрдВрдХреНрд╢рдВрд╕ рдХреЗ рдирд┐рдпрдореЛрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬреЛ рдЧрдгрд┐рддреАрдп рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИрдВред рджреЛ рдирд┐рдпрдо рдирд┐рдпрдо рд╣реИрдВ:
fmap id = id
fmap (gред h) = fmap gред fmap h
рдкрд╣рд▓рд╛ рдирд┐рдпрдо рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд╣рдЪрд╛рди рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдореИрдк рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдкреНрд░рднрд╛рд╡ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рд╣реИред рджреВрд╕рд░рд╛ рдирд┐рдпрдо рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХреЗ рдКрдкрд░ рджреЛ рдлрд╝рдВрдХреНрд╢рди рдХреА рд╕рдВрд░рдЪрдирд╛ рдкрд╣рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдФрд░ рдлрд┐рд░ рджреВрд╕рд░реЗ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд╕рдорд╛рди рд╣реИред
рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд╛ рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг рдЬреЛ рдЙрдиреНрд╣реЗрдВ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рд╡рд╣ рд╣реИ рдкреЗрдбрд╝реЛрдВ рдкрд░ рдкрд░рд┐рдЪрд╛рд▓рдиред рдПрдХ рдХрдВрдЯреЗрдирд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкреЗрдбрд╝ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪреЛ, рдФрд░ рдлрд┐рд░ рдкреЗрдбрд╝ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рддреЗ рд╣реБрдП, рдкреЗрдбрд╝ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдкрд░
fmap
рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВред
рдЪрд▓реЛ рдкрд╣рд▓реЗ рдПрдХ рдкреЗрдбрд╝ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ,
рдбреЗрдЯрд╛ рдЯреНрд░реА a = рдиреЛрдб ( рдЯреНрд░реА ) ( рдЯреНрд░реА рдП )
| рдкрддреНрддреА рдП
рд╡реНрдпреБрддреНрдкрдиреНрди рд╢реЛ
рдпрд╣ рдкрд░рд┐рднрд╛рд╖рд╛ рдХрд╣рддреА рд╣реИ рдХрд┐
Tree
рдЯрд╛рдЗрдк рдпрд╛ рддреЛ рджреЛ
Tree
(рд▓реЗрдлреНрдЯ рдФрд░ рд░рд╛рдЗрдЯ рдмреНрд░рд╛рдВрдЪ) рдХреА рдПрдХ
Node
(рд╢рд╛рдЦрд╛) рдпрд╛
Leaf
(рдкрддреНрддреА) рд╣реИред
deriving Show
рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣рдореЗрдВ рд╢реЛ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреЗрдбрд╝ рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред
рдЕрдм рд╣рдо рдкреЗрдбрд╝реЛрдВ рдХреЗ рдкреЗрдбрд╝реЛрдВ рдкрд░
Functor
рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ,
рдЙрджрд╛рд╣рд░рдг рдлрд╝рдирдХрд╛рд░ рдЯреНрд░реА рдЬрд╣рд╛рдБ
fmap g ( рд▓реАрдл v ) = рд▓реАрдл ( g v )
fmap g ( Node l r ) = рдиреЛрдб ( fmap g l ) ( fmap g r )
рдпрд╣ рдкрд░рд┐рднрд╛рд╖рд╛ рдХрд╣рддреА рд╣реИ рдХрд┐ рдорд╛рди
v
рд╕рд╛рде
Leaf
рдКрдкрд░ рдПрдХ рдлрдВрдХреНрд╢рди
g
рдХрд╛
fmap
g
рд╕реЗ
v
рд▓рд┐рдП рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред рдФрд░ рдмрд╛рдПрдВ рд╢рд╛рдЦрд╛
l
рдФрд░ рджрд╛рдПрдВ
r
рд╕рд╛рде
Node
рдкрд░
g
рд╕реЗ
fmap
рдмрд╛рдИрдВ рдФрд░ рджрд╛рдИрдВ рд╢рд╛рдЦрд╛рдУрдВ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдП рдЧрдП
fmap
рд╕реЗ рд╕рд┐рд░реНрдл
Node
рд╣реИред
рдЕрдм рдЖрдЗрдП рд╣рдо
fmap
рдХрд┐ рдкреЗрдбрд╝реЛрдВ рдХреЗ рд╕рд╛рде
fmap
рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЖрдЗрдП
String
рдкрддреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдкреЗрдбрд╝ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рд╢реАрдЯ рдХреА рд▓рдВрдмрд╛рдИ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдирдХреЗ рдКрдкрд░ рд▓рдВрдмрд╛рдИ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
рдкреНрд░рд╕реНрддрд╛рд╡рдирд╛ рджреЗрдВ> рдкреЗрдбрд╝ = (рдиреЛрдб (рдкрддреНрддреА "рдирдорд╕реНрддреЗ") (рдкрддреНрддреА "рдлреВ")) (рдкрддреНрддреА "рдмрд░"))
рдкреНрд░рд╕реНрддрд╛рд╡рдирд╛> рд▓рдореНрдмрд╛рдИ рдХрд╛ рдкреЗрдбрд╝
рдиреЛрдб (рдиреЛрдб 5) (рдкрддреНрддреА 3) (рдкрддреНрддреА 4)
рдпрд╣рд╛рдБ рд╣рдордиреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреЗрдбрд╝ рдмрдирд╛рдП рд╣реИрдВ,
*
/ \ _
/ \ _
* "рдмрд░"
/ \ _
/ \ _
/ \ _
/ \ _
"рд╣реИрд▓реЛ" "рдлреВ"
рдФрд░ рдЗрд╕рдХреЗ рдКрдкрд░ рдХреА
length
рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рд╣рдореЗрдВ рджреЗрддрд╛ рд╣реИ
*
/ \ _
/ \ _
* рек
/ \ _
/ \ _
/ \ _
/ \ _
рел рей
рдпрд╣ рдХрд╣рдиреЗ рдХрд╛ рдПрдХ рдФрд░ рддрд░реАрдХрд╛ рд╣реИ рдХрд┐
fmap
рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ (рдореВрд▓ рджреБрдирд┐рдпрд╛ рдореЗрдВ, "рд╕рд╛рдорд╛рдиреНрдп рджреБрдирд┐рдпрд╛" рд╕реЗ рдПрдХ рд╕рдорд╛рд░реЛрд╣ "
f
рджреБрдирд┐рдпрд╛")ред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдПрдХ рдлрдирдХрд╛рд░ рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рдПрдХ рдореМрд▓рд┐рдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╡рд░реНрдЧ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореЛрдирд╛рдбреНрд╕, рдРрдкреНрд▓рд┐рдХреЗрдЯрд┐рд╡ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдФрд░ рддреАрд░ рд╕рднреА рдлрд╝рдВрдХреНрд╢рдВрд╕ рд╣реИрдВред рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рд╣рд╛рд╕реНрдХреЗрд▓ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдлрдВрдХреНрд╢рдВрд╕ рд╢реБрд░реВ рд╣реЛрддреЗ рд╣реИрдВред
рдпрджрд┐ рдЖрдк рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рдЯрд╛рдЗрдк рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЙрддреНрдХреГрд╖реНрдЯ
рдЯрд╛рдЗрдкреЗрдХреЗрд▓реЛрдкреЗрдбрд┐рдпрд╛ рд▓реЗрдЦ (рдкреГрд╖реНрда 17 рдкрд░ рд╢реБрд░реВ) рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВред
рдкреНрд░реЛрд▓реЛрдЧ рдореЗрдВ рдлрдирдХрд╛рд░
рдФрд░ рдЕрдВрдд рдореЗрдВ, рдкреНрд░реЛрд▓реЛрдЧ рдореЗрдВ рдлрдВрдХреНрд╢рдВрд╕ред рдкреНрд░реЛрд▓реЛрдЧ рдореЗрдВ рдлрд╝рдирдХрд╛рд░ рдЙрди рд╕рднреА рдореЗрдВ рд╕рдмрд╕реЗ рд╕рд░рд▓ рд╣реИрдВред рджреЛ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕рдВрд░рдЪрдирд╛ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдкрд╣рд▓рд╛ рдкрд░рдорд╛рдгреБ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рд▓реЗрдВ
? - рдкрд╕рдВрдж ( рдореИрд░реА , рдкрд┐рдЬреНрдЬрд╛ )
рдкрд╣рд▓рд╛ рдкрд░рдорд╛рдгреБ,
likes
рдПрдХ рдлрд╝рдирдХрд╛рд░ рд╣реИред
рджреВрд╕рд░рд╛ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╡рд┐рдзреЗрдп рд╣реИ рдЬрд┐рд╕реЗ
functor
рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдПрд░рд┐рдЯреА рдФрд░ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдлрдиреНрдХреНрдЯрд░ рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП
? - functor ( рдкрд╕рдВрдж ( mary , рдкрд┐рдЬрд╝реНрдЬрд╝рд╛ ) , Functor , Arity ) ред
рдлрд╝рдирдХрд╛рд░ = рдкрд╕рдВрдж
рдзрдо = реи
рдпрд╣рд╛рдБ рдЖрдкрдХреЗ рдкрд╛рд╕ Prolog рдореЗрдВ рдлрдВрдХреНрд╢рдиреНрд╕ рд╣реИрдВред
рдирд┐рд╖реНрдХрд░реНрд╖
рдпрд╣ рдЖрд▓реЗрдЦ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ "рдлрд╝рдВрдХреНрдЯрд░" рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╕рд░рд▓ рд╢рдмреНрдж рдХреЛ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдЪреАрдЬреЛрдВ рдХреЛ рдХреИрд╕реЗ рд╕рдВрджрд░реНрднрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЬрдм рдЖрдк рдлрдиреНрдиреЗ рд╢рдмреНрдж рдХреЛ рд╕реБрдирддреЗ рд╣реИрдВ, рддреЛ рдЙрд╕ рд╕рдВрджрд░реНрдн рдХреЛ рдЬрд╛рдирдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдореВрд▓ рд▓реЗрдЦ: www.catonmat.net/blog/on-functors
рдФрд░, рдпрд╣рд╛рдБ рдРрд╕реА рдмрд╛рдд ... рдореБрдЭреЗ рдпрд╣рд╛рдБ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ рдХрд┐, рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛, рдЬрд┐рд╕ рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рд▓реЗрдЦ рдореИрдВрдиреЗ рд╣рдм рдкрд░ рд▓рд┐рдЦрд╛ рд╣реИ =)
рд╡реЗ рдпрд╣ рднреА рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рд▓реЗрдЦ рдореЗрдВ рдкреНрд░реЛрд▓реЙрдЧ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдЧрд▓рдд рд╣реИ ред