рдирдорд╕реНрддреЗред
рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рд╣реБрдЖ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ C ++ 11 рдореЗрдВ рд▓реИрдореНрдмрдбрд╛ рдПрдХреНрд╕рдкреНрд░реЗрд╢рдВрд╕ рдХреЗ рд╕рд╛рде рдлреБрд░рд╕рдд рдХреЗ рд╕рд╛рде рдЦреЗрд▓рд╛ (рдЬреЛ рдХрд┐, рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА
рдПрдХ рд▓реЗрдЦ рд▓рд┐рдЦрд╛ рдерд╛ , рдЬрд┐рд╕рдиреЗ рдХреБрдЫ рд╕рд╛рд▓ рдкрд╣рд▓реЗ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рд░реВрдк рд╕реЗ рдЕрдЪреНрдЫреА рд▓реЛрдХрдкреНрд░рд┐рдпрддрд╛ рд╣рд╛рд╕рд┐рд▓ рдХреА рдереА), рдФрд░
рдбреНрд░рдЧреНрд╕ рдХреЗ
рдкреНрд░рднрд╛рд╡ рдореЗрдВ рдореИрдВ рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реБрдЖ
рдерд╛ред рд╣рд╛рд╕реНрдХреЗрд▓ рдиреЗ C ++ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЖрдВрд╢рд┐рдХ рдЙрдкрдпреЛрдЧ рдФрд░ рдХрд░реАрдиреЗ рдЬреИрд╕реА рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЛ рд╕рдордЭрдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ред рдФрд░ рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП, рд╢рд╛рдпрдж рдЗрди рд╢рд░реНрддреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЖрдВрд╢рд┐рдХ рдЙрдкрдпреЛрдЧ рдлрд╝рдВрдХреНрд╢рди рдорд╛рдкрджрдВрдбреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдорд╛рди рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд рдПрди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рд╣рдореЗрдВ рдПрди -1 рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдорд┐рд▓рддрд╛ рд╣реИред рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдмрд╛рдЗрдирд░реА рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рджреЛ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рдмрддрд╛рддрд╛ рд╣реИ:
int sum(int a, int b) { return a + b; }
рдлрд┐рд░ рд╣рдо рдХрд┐рд╕реА рдПрдХ рдорд╛рдирджрдВрдб рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдорд╛рди рддрдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 42. рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдореЗрдВ рдПрдХ рдирдпрд╛, рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдлрд╝рдВрдХреНрд╢рди рдорд┐рд▓рддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рддрд░реНрдХ рдореЗрдВ рд╕рдВрдЦреНрдпрд╛ 42 рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред
рдХрдбрд╝рд╛рдИ рд╕реЗ рдмреЛрд▓рдирд╛, рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЖрдВрд╢рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдкрд┐рдЫрд▓реЗ C ++ рдорд╛рдирдХ рдореЗрдВ рдерд╛ред рджреЛ
std::binder1st
рдФрд░
std::binder2nd
рд╡рд░реНрдЧреЛрдВ рдиреЗ рдЗрд╕ рднреВрдорд┐рдХрд╛ рдХреЛ рдирд┐рднрд╛рдпрд╛, рд╕рд╛рде рд╣реА рд╕рд╛рде рдкреНрд░рд╕рд┐рджреНрдз рд╕рд╣рд╛рдпрдХ рдХрд╛рд░реНрдп
std::bind1st
рдФрд░
std::bind2nd
, рдЬреЛ рдЙрдкрд░реЛрдХреНрдд рд╡рд░реНрдЧреЛрдВ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рд╕рд░рд▓ рдмрдирд╛рддреЗ рд╣реИрдВред рд╕рдЪ рд╣реИ, рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ: рдпреЗ рдмрд╛рдЗрдВрдбрд░реНрд╕ рд╕рд╛рдзрд╛рд░рдг рдлрд╝рдВрдХреНрд╢рди рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ, рдХреНрдпреЛрдВрдХрд┐ рдЙрдиреНрд╣реЗрдВ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЗрд╕реЗ рдФрд░ рдЕрдиреНрдп рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, STL рд╣рд░ рдЬрдЧрд╣ рдлрдВрдХреНрд╢рдирд▓рд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдИрдорд╛рдирджрд╛рд░ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╡рд╕реНрддреБрдПрдВ рдХрд╣рдирд╛ рдкрд╕рдВрдж рдХрд░реВрдВрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЬрдм рдореИрдВ рд╣рд╛рд╕реНрдХреЗрд▓ рд╕реЗ рдорд┐рд▓рд╛, рддрдм рд╕реЗ "рдлрдиреНрдиреЗрдХрд╛рд░" рд╢рдмреНрдж рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рд╕рд╛рд░ рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, C ++ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░реНрд╕ рдХреЗ рд╕рд░реНрдХрд▓ рдореЗрдВ, рдпрд╣ рд╢рдмреНрдж рдЙрди рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдкрджрдирд╛рдо рдХреЗ рд▓рд┐рдП рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ рддрдп рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ рдХрд╛рд░реНрдпреЛрдВ рдХреА рддрд░рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ; рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рддреЗрдЬ рд╣реИ :)
рддреЛ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдХреИрд╕реЗ рд╣рд▓ рдХреА рдЬрд╛рддреА рд╣реИ? рдЕрдЧрд░ рдХреЛрдИ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рд╣реИ, рддреЛ рдореИрдВ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдмрддрд╛рдКрдВрдЧрд╛ред
std::binder1st
рдФрд░
std::binder2nd
, рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдХреЗрд╡рд▓ рдмрд╛рдЗрдирд░реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдЖрдкрдХреЛ рдЬрд┐рд╕
std::binder2nd
рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ: рдпреЗ result_type, first_argument_type рдФрд░ second_argument_type рд╣реИрдВред рд╣рд░ рдмрд╛рд░ рдЕрдкрдиреЗ
std::binary_function<T0,T1,R>
рдореЗрдВ рдЗрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдШреЛрд╖рд┐рдд рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдмрд╕
std::binary_function<T0,T1,R>
рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдБ T0 рдФрд░ T1 рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ, рдФрд░ R рдХреНрд░рдорд╢рдГ рд░рд┐рдЯрд░реНрди рдорд╛рди рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИред
рдЗрд╕ рдкреВрд░реА рдЪреАрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреБрдЫ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
template <typename T> struct Sum : public std::binary_function<T, T, T> { T operator()(T const & a, T const & b) { return a + b; } };
рдЬреЛ рдирд┐рд░реНрдорд╛рдг рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдПрд╕рдЯреАрдПрд▓ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ, рд╡реЗ рдЕрдм рдЗрд╕ рддрд░рд╣ рдХреЗ рдирд┐рд░реНрдорд╛рдгреЛрдВ рд╕реЗ рдбрд░рддреЗ рдирд╣реАрдВ рд╣реИрдВ (рдФрд░ рдореИрдВ, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЙрдирдореЗрдВ рд╕реЗ рд╣реИрдВ), рд▓реЗрдХрд┐рди рдореЗрд░рд╛ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдХрд░реЛ, рдЗрди рд╕рднреА рд╡рд┐рд╢реЗрд╖ рдкрд╛рддреНрд░реЛрдВ рдФрд░ рд░реИрдкрд░реЛрдВ рдХреЛ рдвреЗрд░ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдирдП рд▓реЛрдЧ рдЬреЛ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рд╕реЗ рд╕реА ++ рдЖрдП рдереЗред рдпрд╛ рддреЛ рдкрдардиреАрдпрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╛рдж рдирд╣реАрдВ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ рд╕рдВрдпреЛрдЬрди рдХреЛ рдЗрд╕рд╕реЗ рднреА рдмреЗрд╣рддрд░ рджреЗрдЦрд╛ :) рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдмрд╛рдж рдореЗрдВ рдмреВрд╕реНрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдПрдХ рдЕрдзрд┐рдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ - рдмреВрд╕реНрдЯ.рдмрд╛рдЗрдВрдб, рдЬреЛ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдкрдардиреАрдпрддрд╛ рдореЗрдВ рдХрдо рднрд┐рдиреНрди (рд╡рд┐рд╢рд┐рд╖реНрдЯ C ++) - рдЗрд╕ рддрд░рд╣ рд╕реЗ ред рд╡реИрд╕реЗ, рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдмреВрд╕реНрдЯред рдмрд╛рдЗрдВрдб рдкреБрд░рд╛рдиреЗ рдмрд╛рдЗрдВрдбрд░реЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдирдП рд╕реА ++ 11 рдорд╛рдирдХ рдкрд░ рдЪрд▓реЗ рдЧрдП, рдЬрд┐рдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВрдиреЗ рдереЛрдбрд╝рд╛ рдКрдкрд░ рдмрд╛рдд рдХреА рдереАред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬрдм рд╡рд╣рд╛рдБ рд╣реИ рддреЛ рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХреМрди рдХрд░реЗрдЧрд╛ ... рдХреНрдпрд╛? рдпрд╣ рд╕рд╣реА рд╣реИ, рд▓рдВрдмреЛрджрд░! рдЦреИрд░, рдЙрдирдХреЗ рд╕рд╛рде, рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдмрд╛рдд рд╣реИ :) рд▓реЗрдЦрди рдХрдо рд╣реИ, рдкрдардиреАрдпрддрд╛ рдмреЗрд╣рддрд░ рд╣реИ (рдмрд╛рдЗрдВрдбрд░реЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдФрд░ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдирд╣реАрдВ;))ред
рддреЛ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕
Sum
, рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдКрдкрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рд╣реИред рдореИрдВ рдХрд╣рдирд╛ рднреВрд▓ рд╕рдХрддрд╛ рд╣реВрдБ, рд▓реЗрдХрд┐рди рдПрд╕рдЯреАрдПрд▓ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдРрд╕рд╛ рд╣реА рдлрд╝рдирдХрд╛рд░ рд╣реИ - std :: plus <>ред рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдордиреЗ рдЕрдкрдиреЗ рд╕рдорд╛рди рд▓рд┐рдЦрд╛ рдерд╛ред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рджреНрд╡рд┐рдЖрдзрд╛рд░реА рдлрд╝рдирдХрд╛рд░ рд╣реИ, рдФрд░ рд╣рдореЗрдВ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рдПрдХрд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд▓рдВрдмреЛрджрд░ рдХреЗ рд╕рд╛рде, рдРрд╕рд╛ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ:
using namespace std;
рдЖрдк рдкреВрдЫ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдпрд╣рд╛рдВ
sum(42, n)
рдХреНрдпреЛрдВ рдХрд╣рддреЗ
sum(42, n)
, рдЬрдм рд╣рдо рд▓реИрдВрдмрдбрд╛ рдХреЗ рд╢рд░реАрд░ рдореЗрдВ рд╕реАрдзреЗ
return 42 + n;
рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ ред рдЕрд╡рд▓реЛрдХрди, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рд╕рдЪ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЖрдВрд╢рд┐рдХ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╣рдорд╛рд░реА рд░реБрдЪрд┐ рдХреНрдпрд╛ рд╣реИ, рдЕрдЧрд░ рдЖрдк рдЕрднреА рддрдХ рдирд╣реАрдВ рднреВрд▓реЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдлрд╝рдВрдХреНрд╢рди рдХреЗрд╡рд▓ рджреЛ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдФрд░ рд╣рдо рдЗрд╕реЗ рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рдХреИрд╕реЗ рд▓рд┐рдЦреЗрдВрдЧреЗ? рд╢рд╛рдпрдж, рдРрд╕рд╛ рдХреБрдЫ рдирд┐рдХрд▓реЗрдЧрд╛:
sum ab = a + b someFunc intList = map (╬╗ n тЖТ sum 42 n) intList
рдпрджрд┐ рдЖрдк рд╣рд╛рд╕реНрдХреЗрд▓ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдирд┐рд░рд╛рд╢рд╛ рди рдХрд░реЗрдВред рдпрд╣ рдХреЛрдб рдкрд┐рдЫрд▓реЗ C ++ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рдорд╛рди рд╣реИред рдЕрдм рдореИрдВ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рд╕рдордЭрд╛рдКрдВрдЧрд╛: рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдореЗрдВ, рд╣рдордиреЗ рдлрд╝рдВрдХреНрд╢рди
sum
рдШреЛрд╖рдгрд╛ рдХреА, рдЬрд┐рд╕рдореЗрдВ
a
b
рдФрд░
b
рд▓рдЧрддрд╛
a
, рдФрд░ рдЙрдирдХрд╛ рдпреЛрдЧ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдЕрдЧрд▓рд╛, рд╣рдордиреЗ рдХреБрдЫ рдлрд╝рдВрдХреНрд╢рди рдХреА рдШреЛрд╖рдгрд╛ рдХреА рдЬреЛ рдХреБрдЫ рд╕реВрдЪреА рдХреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддреЗ рд╣реИрдВ (рд╢рд╛рдпрдж рдкреВрд░реНрдгрд╛рдВрдХ рдХреА рдПрдХ рд╕реВрдЪреА, рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдирд╛рдо рд╕реЗ рджреЗрдЦрддреЗ рд╣реБрдП) рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдХреБрдЫ рдХрд░рддреЗ рд╣реИрдВред
map
рдлрд╝рдВрдХреНрд╢рди
std::for_each
рдХрд╛ рдПрдХ рдПрдирд╛рд▓реЙрдЧ рд╣реИ, рдЕрд░реНрдерд╛рдд рдпрд╣ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рд╕реВрдЪреА рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рдХрд╣рддрд╛ рд╣реИред рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рдПрдХ рд▓рдВрдмреЛ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ
sum
рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЗрд╕реЗ рдкрд╣рд▓реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдорд╛рди рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд▓рдВрдмрд╛ рддрд░реНрдХ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рджреВрд╕рд░реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╕рдм рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ ... рдпрд╛ рдпреЛрдВ рдХрд╣реЗрдВ рдХрд┐ рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реЛрддрд╛ рдЕрдЧрд░ рд╕рдорд╛рди рд╣рд╛рд╕реНрдХреЗрд▓ рдХреЛрдб рдХреЛ рдЗрд╕ рддрд░рд╣ рдирд╣реАрдВ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛:
sum ab = a + b someFunc intList = map (sum 42) intList
рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ, рдЗрд╕ рдмрд╛рд░ рд▓реИрдореНрдмреНрдбрд╛ рдХреЗ рдмрдЬрд╛рдп, рд╣рдордиреЗ рдПрдХ рдмрд╣реБрдд рдЫреЛрдЯреЗ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рдЕрд░реНрдерд╛рддреН
рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде
рдмрд╛рдЗрдирд░реА рдлрд╝рдВрдХреНрд╢рди
sum
рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ред рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ? рд╣рд╛рдБ, рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ! :) рдХреЙрд▓
(sum 42)
рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдлрд╝рдВрдХреНрд╢рди рд▓реМрдЯрд╛рдПрдЧрд╛ рдЬреЛ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рд╕рдВрдЦреНрдпрд╛ 42 рдХреЗ рд╕рд╛рде
sum
ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдПрдХ рд╣реА рдЖрдВрд╢рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╣реИ - рд╣рдо рдХреЗрд╡рд▓
sum
рдлрд╝рдВрдХреНрд╢рди рдХрд╣рддреЗ рд╣реИрдВ: "рдпрд╣рд╛рдВ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкрд╣рд▓рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИ, рдЗрд╕реЗ рдпрд╛рдж рд░рдЦреЗрдВ! рд▓реЗрдХрд┐рди рд╣рдо рдЕрднреА рднреА рджреВрд╕рд░реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдмрд╛рдж рдореЗрдВ рдЗрд╕рд╕реЗ рдирд┐рдкрдЯрдирд╛ рд╣реЛрдЧрд╛ред тАЭ рдпрд╣ рд╕рдм рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рд╕рднреА рдлрд╝рдВрдХреНрд╢рди рдХрд░реА рд╣реИрдВ (рд╡реИрд╕реЗ, рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдЧрдгрд┐рддрдЬреНрдЮ рдереЗ - рд╣рд╛рд╕реНрдХреЗрд▓ рдХрд░реА;))ред рдЗрд╕рд▓рд┐рдП рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рд╣реИред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдХрд░реА рдПрдХ рдСрдкрд░реЗрд╢рди рд╣реИред рдпрд╛рдиреА рд╣рд╛рд╕реНрдХреЗрд▓ рдмреНрд░рд╣реНрдорд╛рдВрдб рдореЗрдВ рдпрд╣ рд╕рд┐рд░реНрдл рдХреБрдЫ рд╕рдВрдкрддреНрддрд┐ рдпрд╛ рдЬрд╛рджреБрдИ рдкреНрд░рд╛рдгреА рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдПрдХ рдкрд░рд┐рд╡рд░реНрддрди рд╣реИред рджреВрд╕рд░реЗ, рдпрд╣ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рд░реВрдкрд╛рдВрддрд░рдг рд╣реИ: рдпрд╣ рдПрди рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рдорд╛рди рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдПрди -1 рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдореИрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рд╕рдордЭрд╛рдКрдВрдЧрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЪрд▓реЛ рд╣рдорд╛рд░реЗ C ++ рдлрд╝рдВрдХреНрд╢рди
sum
рд▓реМрдЯрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рдПрдХ рдФрд░ рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ (рдмрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ):
template <typename T1, typename T2, typename T3, typename R> R sum(T1 a, T2 b, T3 c) { return a + b + c; }
рдЪреВрдБрдХрд┐ рд╣рдо рдХреЗрд╡рд▓ рдорд╛рдкрджрдВрдбреЛрдВ рдФрд░ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рд╣рдо рдЗрд╕рдХреЗ рдкреНрд░рдХрд╛рд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд▓рд┐рдЦреЗрдВрдЧреЗ:
sum :: ((T1 ├Ч T2 ├Ч T3) тЖТ R)
рдЗрд╕ рд░рд┐рдХреЙрд░реНрдб рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреНрд░рдорд╢рдГ T1, T2 рдФрд░ T3 рдкреНрд░рдХрд╛рд░ рдХреЗ рддреАрди рддрд░реНрдХ рд▓реЗрддрд╛ рд╣реИ, рдФрд░ рдкреНрд░рдХрд╛рд░ R рдХрд╛ рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХрд░реА рдХреЗ рдмрд╛рдж, рдКрдкрд░ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд╣рдореЗрдВ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:
sum :: (T1 тЖТ ((T2 ├Ч T3) тЖТ R))
рдпрд╣реА рд╣реИ, рдпрд╣ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдЯрд╛рдЗрдк T1 рдХреЗ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рд▓реЗрддрд╛ рд╣реИ, рдФрд░ рдПрдХ рдЕрдиреНрдп рдлрд╝рдВрдХреНрд╢рди рджреЗрддрд╛ рд╣реИ, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ рдХреНрд░рдорд╢рдГ T2 рдФрд░ T3 рдХреЗ рджреЛ рддрд░реНрдХ рд▓реЗрддрд╛ рд╣реИ, рдФрд░ рд░рд┐рдЯрд░реНрди (рдкрд╣рд▓реЗ рдХреА рддрд░рд╣) рдЯрд╛рдЗрдк R рдХрд╛ рдПрдХ рдорд╛рди рд▓реЗрддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдо рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрд╣рд▓рд╛ рдкреИрд░рд╛рдореАрдЯрд░ "рдмрдВрдж" рдХрд░рддреЗ рд╣реИрдВред рдФрд░ рдХрд╣рддреЗ рд╣реИрдВ, рд╡реЗ рдХрд╣рддреЗ рд╣реИрдВ, "рд╣рдо рдЙрд╕реЗ рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ, рдЪрд┐рдВрддрд╛ рдордд рдХрд░реЛред" рдФрд░ рдлрд┐рд░ рд╣рдо рдПрдХ рд╕рдорд╛рди рдлрд╝рдВрдХреНрд╢рди рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдХрдо рд▓реЗрддрд╛ рд╣реИред рдХреНрдпрд╛ рдХреБрдЫ рднреА рд╕рдорд╛рди рдирд╣реАрдВ рд╣реИ? рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдЖрдВрд╢рд┐рдХ рдЖрд╡реЗрджрди рдХреЛ рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ!
рд▓реЗрдХрд┐рди ... рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдореИрдВ рдереЛрдбрд╝рд╛ рдЪрд╛рд▓рд╛рдХ рдерд╛ред рдпрджрд┐ рд╕рдм рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдкрд░рд┐рдгрд╛рдореА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреНрд░рдорд┐рдХ рдлрд╝рдВрдХреНрд╢рди рддрд░реНрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЕрдкрдиреЗ рдЖрдк рдХреЗ рд▓рд┐рдП рдиреНрдпрд╛рдпрд╛рдзреАрд╢: рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЯрд░реНрдирд░реА рдлрд╝рдВрдХреНрд╢рди рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдо рдХрд░реА рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рдЕрд╕рдорд╛рди рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рдПрдХрддрд░рдлрд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП, рд╣рдо рдЗрд╕рдХрд╛ рдПрдХрдорд╛рддреНрд░ рдкреИрд░рд╛рдореАрдЯрд░ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╣рдореЗрдВ рдПрдХ рдФрд░ рдмрд╛рдЗрдирд░реА рдлрд╝рдВрдХреНрд╢рди рдорд┐рд▓рддрд╛ рд╣реИред рдЕрдм, рдпрджрд┐ рд╣рдо рдХрд┐рд╕реА рдЕрдиреНрдп рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрдВрд╢рд┐рдХ рдЖрд╡реЗрджрди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдХрд░реАрдХрд░рдг рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдХреЗрд╡рд▓ рдЕрдм рдПрдХ рдмрд╛рдЗрдирд░реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдПред рдЗрд╕рд╕реЗ рд╣рд░ рдмрд╛рд░ рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдмреЗрд╡рдХреВрдл рдмрдирд╛рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХрд░реА рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдорд┐рд▓рддреЗ рд╣реИрдВ:
sum :: (T1 тЖТ (T2 тЖТ (T3 тЖТ R)))
рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдпрд╣ рд╡рд╣реА рд╣реИ, рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рдЗрдирд░реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдЗрд╕реЗ рддреБрд░рдВрдд рдХрд░реА рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдмрд╣реБ-рдЗрдирдкреБрдЯ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рд╣рдореЗрдВ рдПрдХ рд╕рдВрдпреБрдХреНрдд рд╢реНрд░реГрдВрдЦрд▓рд╛ рдорд┐рд▓реА, рдЬреЛ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рддрд░реНрдХреЛрдВ рдХреЛ рдХреНрд░рдо рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ, рдФрд░ рджреВрд╕рд░реА рдмрд╛рдд, рд╕рднреА рддрд░реНрдХреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╕рдордп, рдпрд╣ рдореВрд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмрд░рд╛рдмрд░ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░реЗрдЧрд╛, рдЕрд░реНрдерд╛рдд рдпрд╣ рдПрдХ рд╣реА рдЖрдЙрдЯрдкреБрдЯ рдкрд░рд┐рдгрд╛рдо рджреЗрдЧрд╛ред ред
рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЕрдм рддрдХ рд╕рдм рдХреБрдЫ рдХрдореЛрдмреЗрд╢ рд╕реНрдкрд╖реНрдЯ рд░рд╣рд╛ рд╣реИред рд▓реЗрдХрд┐рди, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рдЖрдк рдореЗрдВ рд╕реЗ рдХрдИ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд╡рд┐рд╕реНрдордпрд╛рджрд┐рдмреЛрдзрдХ рдХреЗ рд╕рд╛рде рдореЙрдирд┐рдЯрд░ рдкрд░ рдПрдХ рдЙрдВрдЧрд▓реА рджрдмрд╛ рд░рд╣реЗ рд╣реИрдВ: "рдареАрдХ рд╣реИ, рдЕрдВрдд рдореЗрдВ рдореБрдЭреЗ рдмреНрд▓рд╛рдЬ рдХреЛрдб рджрд┐рдЦрд╛рдУ!" рдЙрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдореИрдВ рдЖрдкрддреНрддрд┐ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред рдЗрд╕рд▓рд┐рдП, рд╕рд┐рджреНрдзрд╛рдВрдд рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдХреЗ рд╕рд╛рде, рд╣рдо рдЕрднреНрдпрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдбрд╝рддреЗ рд╣реИрдВред рдпрд╣ 2012 рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдирдП C ++ 11 рдорд╛рдирдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╣рдо рдЦреБрдж рдХреЛ рдХреЗрд╡рд▓ рдЙрд╕реА рддрдХ рд╕реАрдорд┐рдд рд░рдЦрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВрдЧреЗ рдЬреЛ Microsoft Visual Studio 2010 рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ - рдирдП рдорд╛рдирдХ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рд╕рдВрднрд╡рддрдГ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЬрд╛рд░реА рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд░рд┐рд▓реАрдЬрд╝ рдХрдВрдкрд╛рдЗрд▓рд░ рд╣реИред
рдЪрд▓реЛ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдПрдХ рдмрд╛рдЗрдирд░реА рдлрд╝рдВрдХреНрд╢рди рд╣реИред рдХрд░реАрдиреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдореЗрдВ рдПрдХ рд╕рдВрдпреБрдХреНрдд рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рд╣рдореЗрдВ рдПрдХ рдФрд░ unary рдлрд╝рдВрдХреНрд╢рди рджреЗрддрд╛ рд╣реИред C ++ 11 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛, рдпрд╣ рдзрдорд╛рдХреЗрджрд╛рд░ рд╢рд▓рдЬрдо рд╕реЗ рдЖрд╕рд╛рди рд╣реИ:
#include <cstddef> #include <iostream> using namespace std; template <typename R, typename T0, typename T1> function<function<R(T1)>(T0)> curry_(function<R(T0,T1)> f) { return [=] (T0 const & t0) -> function<R(T1)> { return [=] (T1 const & t1) { return f(t0, t1); }; }; } int sum(int a, int b) { return a + b; } int main() { auto curried_sum = curry_<int,int,int>(sum); cout << sum(42, 10) << endl; // => 52 cout << curried_sum(42)(10) << endl; // => 52 return EXIT_SUCCESS; }
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдРрд╕реА рдЪреАрдЬреЗрдВ рд╣реЛрддреА рд╣реИрдВ: рд╣рдорд╛рд░рд╛
curry_
рдлрд╝рдВрдХреНрд╢рди рддреАрди рдЯреЗрдореНрдкрд▓реЗрдЯ рдкреИрд░рд╛рдореАрдЯрд░ (рдлрд╝рдВрдХреНрд╢рди рддрд░реНрдХ рдФрд░ рд╡рд╛рдкрд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рдХрд╛рд░) рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддрд╛ рд╣реИ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБ
std::function<>
ред рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЛ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рдпрд╣ рдПрдХ рдРрд╕рд╛ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдХрдВрдЯреЗрдирд░ рд╣реИ рдЬреЛ рдлрдВрдХреНрд╢рдирд▓рд░реНрд╕, рд▓реИрдореНрдмреНрдбрд╛ рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЛ рдлрд╝рдВрдХреНрд╢рдВрд╕ (Yay! рдЕрдзрд┐рдХ рдмрдВрдЯ :)) рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╡рд╕реНрддреБ рд╣реИ, рдЕрд░реНрдерд╛рдд рдЗрд╕рдореЗрдВ
operator()
рдУрд╡рд░рд▓реЛрдб рд╣реИред рдЕрдЧрд▓рд╛, рд╣рдо рдмрд╕ рдпреВрд░реА рд▓реИрдореНрдмреНрдбрд╛ (рдореВрд▓ рд░реВрдк рд╕реЗ рдПрдХ рдЕрдирд╛рдо рдлрд╝рдирдХрд╛рд░) рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ, рдЬреЛ рдПрдХ рдФрд░ рдЧреИрд░реА рд▓реИрдореНрдмреНрдбрд╛ рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдпрд╣ рд░реВрд╕реА рд╕реЗ рд╕реА ++ рдореЗрдВ
рдХрд░реА рд╢рдмреНрдж рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдПрдХ рдЕрдиреБрд╡рд╛рдж рдореЗрдВ рд▓рдЧрднрдЧ рдПрдХ рд╣реИред
рдЕрдм рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХреНрд╖рдг рдЖ рдЧрдпрд╛ рд╣реИред рдЗрд╕ рд╕реНрдерд╛рди рдкрд░ рдкрдврд╝рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдХреЛ рдЕрдкрдиреЗ рднреАрддрд░ рдХреА рдЖрд╡рд╛рдЬрд╝ рд╕реЗ рдкреВрдЫрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдХреМрди рд╕рд╛ рд╡рд┐рдХрд▓реНрдк рдкрд╕рдВрдж рд╣реИ:
std::bind1st(std::function<int(int,int)>(sum), 42)(10);
рдпрджрд┐ рдкрд╣рд▓реЗ, рдЖрдк рдЕрдм рдирд╣реАрдВ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдореЗрд░рд╛ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдХрд░реЛред рдЕрдЧрд░ рджреВрд╕рд░рд╛, рддреЛ рдореБрдЭреЗ рдЖрдкрдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ ... рдореИрдВ рдЦреБрдж рджреВрд╕рд░реЗ рд╡рд┐рдХрд▓реНрдк рдХреА рддрд░рд╣ рдирд╣реАрдВ рд╣реВрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рдмрд╣реБрдд рдмреЗрд╣рддрд░ рд╣реИред
рдПрдХ рддрд░рд╣ рд╕реЗ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп, рдореИрдВ рддрд░реНрдХ рдФрд░ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╕реЗ рдереЛрдбрд╝рд╛ рдкрд░реЗрд╢рд╛рди рд╣реВрдВред рдХрдВрдкрд╛рдЗрд▓рд░ рдЕрдкрдиреЗ рдЖрдк рд╣реА рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдирд╣реАрдВ рджреЗ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рд╕рдВрдХреЗрдд рджреЗрдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдЧрд░ рд╣рдо
curry_
рдлрдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП
curry_
рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдУрд╡рд░рд▓реЛрдб рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЕрд╕рдлрд▓ рд╣реЛ рдЬрд╛рдПрдВрдЧреЗ рдХреНрдпреЛрдВрдХрд┐ рдХрдВрдкрд╛рдЗрд▓рд░
std::function<>
рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рд╕рдордЭрддрд╛ рд╣реВрдВ, рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐
std::function<>
рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╣реИ рдЬреЛ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдЕрдм рдЗрд╕рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдПрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдордЭрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рддрдереНрдп рдпрд╣ рд╣реИред рдФрд░ рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред
рд╣рдо рдирд┐рдореНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реНрдХреЛрдВ рдФрд░ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдкреНрд░рд╢реНрди рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВрдЧреЗред
curry_
рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВ рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдо рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдЖрд╡рд░рдг рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рд╣рдо рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВрдЧреЗред рдЗрд╕рдХреЗ рдмрд╛рдж, рд╣рдо
function_traits
рдЬреИрд╕рд╛ рдХреБрдЫ рд▓рд┐рдЦреЗрдВрдЧреЗ (рд╡реИрд╕реЗ, рдпрд╣ рдЕрдЬреАрдм рд╣реИ рдХрд┐ рдпрд╣ рдорд╛рдирдХ рдореЗрдВ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдирд╣реАрдВ рд╣реИ;), рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдкреНрд░рдХрд╛рд░ рдХреЗ рддрд░реНрдХреЛрдВ рдХреЛ рдпрд╛рдж рд░рдЦреЗрдВрдЧреЗ, рдЖрджрд┐ред рддрдерд╛рдХрдерд┐рдд рд▓рдХреНрд╖рдг рд╡рд░реНрдЧреЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЖрдорддреМрд░ рдкрд░ рдПрд╕рдЯреАрдПрд▓ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдРрд╕рд╛ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
template <typename Func> struct function_traits {};
рдареАрдХ рд╣реИ, рдмрд╣реБрдд рдкрдардиреАрдп рдХреЛрдб рдХреА рд╕рд┐рд░реНрдл рджреЛ рджрд░реНрдЬрди рд▓рд╛рдЗрдиреЗрдВ, рдФрд░ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
cout << curry(sum)(42)(10) << endl;
рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдпрд╣ рдПрдХ рд╕рдлрд▓рддрд╛ рд╣реИ! :) рдпрд╣ рдЯрд░реНрдирд░реА рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП
curry_
рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИ, рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╣рдореЗрдВ рдЗрди рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдирд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ - рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдУрд╡рд░рд▓реЛрдб рдХрд░рдХреЗ рд╕рдм рдХреБрдЫ рд╣рд▓ рдХрд░рдиреЗ рджреЗрдВред рдЕрдм рддрдХ, рдореЗрд░реА рд╡реГрддреНрддрд┐ рдореБрдЭрд╕реЗ рдХрд╣рддреА рд╣реИ рдХрд┐ рдпрд╣ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╣реЛрдЧрд╛ред рдХрдо рд╕реЗ рдХрдо
curry
рдЖрд╡рд░рдг рдлрд╝рдВрдХреНрд╢рди рджреЗрдЦреЗрдВ: рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ (рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕реАрдзреЗ рдХрд░реНрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ) рд▓реЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рд╣рдореЗрд╢рд╛ рдлрд╝рдВрдХреНрд╢рди рдХреА рд╕рдорддрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП (рдпрд╛рдиреА рдпрд╣ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓реМрдЯрд╛рдПрдЧрд╛ рдЬреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдпрд╛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рджреЗрддрд╛ рд╣реИ, рдпрд╛ ... mmm, рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ)ред
рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕реЛрдЪрдиреЗ рдФрд░ рдкреНрд░реЗрд░рдгрд╛ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП
рдереЛрдбрд╝рд╛ рдореЗрдЯрд╛рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдореЛрдбрд╝ рджреЗрдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХрд╛рддреНрдордХ, рдмрд╛рдЗрдирд░реА, рдЯрд░реНрдирд░реА, ... n-ary рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдк
function_traits
рдПрдХ рд╕реНрдерд┐рд░ рд╕реНрдерд┐рд░рд╛рдВрдХ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреА рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдЕрд▓рдЧ рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рдЖрд░рдВрдн рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рдЕрдкрдиреЗ
curry
рд░реИрдкрд░ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд
рдбрдореА рддрд░реНрдХ рдЬреЛрдбрд╝реЗрдВрдЧреЗ, рдЬреЛ рдХреЗрд╡рд▓ рд╕рдВрдХрд▓рди рдЪрд░рдг рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдУрд╡рд░рд▓реЛрдб рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рднрд╛рдЧ рд▓реЗрдВрдЧреЗред
рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ:
template <typename Func> struct function_traits {};
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рд╣реИред рд╣рдордиреЗ рджреВрд╕рд░реЗ рдбрдореА рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдЬреЛрдбрд╝рдХрд░ рдлрд╝рдВрдХреНрд╢рди рдУрд╡рд░рд▓реЛрдбрд┐рдВрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ред рдпрд╣ рдкреИрд░рд╛рдореАрдЯрд░ рдУрд╡рд░рд▓реЛрдб рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдХреЗ рджреМрд░рд╛рди рдЕрдиреБрдЪрд┐рдд
curry
рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ "рдмрдВрдж" рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
std::enable_if
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рд╣рдордиреЗ рдпреВрдирд┐рд░реА рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд░реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рднреА рдЬреЛрдбрд╝рд╛ рдЬреЛ рдореВрд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддрд╛ рд╣реИред рдпрд╣
curry_
рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП
curry_
рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИред рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рднрд╛рдЧ рдореЗрдВ, рдореИрдВрдиреЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рдПрдХ рдЯрд░реНрдирд░реА рдлрд╝рдВрдХреНрд╢рди рдХреА рдХрд░реА рдХреЗ рджреМрд░рд╛рди, рдкрд░рд┐рдгрд╛рдо рдПрдХрд╛рддреНрдордХ рд╣реЛрдЧрд╛, рдЬреЛ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ рджреЛ рддрд░реНрдХреЛрдВ рдХреЗ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдХреЗ рдХрд░реА рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдЗрд╕ рдЬреНрдЮрд╛рди рдХреЗ рд╕рд╛рде, рддреАрди рддрд░реНрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЕрддреНрдпрдВрдд рд╕рд░рд▓ рд╣реИ:
<typename R, typename T0, typename T1, typename T2> function<function<function<R(T2)>(T1)>(T0)> curry_(function<R(T0,T1,T2)> f) { return [=] (T0 const & t0) -> function<function<R(T2)>(T1)> { return curry_<R,T1,T2>([=] (T1 const & t1, T2 const & t2) { return f(t0,t1,t2); }); }; }
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдореИрдВрдиреЗ
mega
рдиреЗрдорд╕реНрдкреЗрд╕ рдореЗрдВ рдпрд╣ рд╕рдм (рдЙрдкрдпреЛрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдЫреЛрдбрд╝рдХрд░) рдХреЛ рд▓рдкреЗрдЯ рджрд┐рдпрд╛ рд╣реИ рдФрд░
function_traits
рд▓рд┐рдП рдлрдВрдХреНрд╢рди_рдЯреНрд░рд┐рдЯреНрд╕ рд╕реНрдкреЗрд╢рд▓рд╛рдЗрдЬреЗрд╢рди рдХреЛ рдПрдХ рд╣реЗрдбрд░ рдлрд╛рдЗрд▓ рдореЗрдВ рднрд░ рджрд┐рдпрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ
GitHub рдкрд░ рдЕрдкрд▓реЛрдб рдХрд░ рджрд┐рдпрд╛
рд╣реИ ред рдХрд┐рд╕реА рднреА рддрд░рд╣ README рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдЧрд╛ :) рдЕрдм рд╣рдо рдЯрд░реНрдирд░реА рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рд╕реА рднреА рдмрдХрд╡рд╛рд╕ рдХреЛ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рдВ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЗрд╕ рддрд░рд╣:
string foo(string s, int i, double d) { ostringstream str; str << s << ": " << i << " . = " << d << "$"; return str.str(); } int main() { cout << mega::curry(foo)("-")(2)(9.95) << endl;
рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рд╕рдВрдкреВрд░реНрдг рдЖрдХрд░реНрд╖рдг рдпрд╣ рд╣реИ рдХрд┐ "рд╡реНрдпрд╛рдкрдХ" рд▓реЛрдЧреЛрдВ рд╕реЗ рдордХреНрдЦреА рдкрд░ рдирдП, рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдп рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕реЗ рдХреИрд╕реЗ рдФрд░ рдХрд╣рд╛рдВ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╣рд░ рдХреЛрдИ рдЦреБрдж рддрдп рдХрд░реЗрдЧрд╛ред
рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ, рдореИрдВрдиреЗ рдпрд╣ рдирд╣реАрдВ рдЬрд╛рдВрдЪрд╛ рдХрд┐ рдХреНрдпрд╛ рдХреБрдЫ рд╕рдорд╛рди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдпрд╣ рдирд╣реАрдВ рдЫреЛрдбрд╝рддрд╛ рдХрд┐ рдореИрдВрдиреЗ рдПрдХ рдФрд░ рдмрд╛рдЗрдХ рд▓рд┐рдЦреА, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рдЕрдХрд╛рджрдорд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдерд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╖реНрдЯрддрдорддрд╛ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдореИрдВ рднреА рдмрд╣реБрдд рд╡рд┐рд╕реНрддрд╛рд░ рдореЗрдВ рдирд╣реАрдВ рдЧрдпрд╛ рдерд╛ред рдореИрдВ рддреБрд░рдВрдд рдХрд╣ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ C ++ рдХрдВрдкрд╛рдЗрд▓рд░ рдРрд╕реА рдЪреАрдЬреЛрдВ рдХрд╛ рдЕрдиреБрдХреВрд▓рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╣рдореЗрдВ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЗ рдмреАрдЪ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЬрд╛рдирдХрд╛рд░реА рдЦреАрдВрдЪрдиреЗ рдХреЗ рд╕рд╛рде
call
рдХрд╛ рдПрдХ рдкреВрд░рд╛ рдЧреБрдЪреНрдЫрд╛ рдорд┐рд▓рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рднреБрдЧрддрд╛рди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред
рдЖрдкрдХреЗ рд╕рд╛рде рдмрд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдкреБрдирд╢реНрдЪ рдореЗрд░реЗ рдкрд╛рд╕ рдЕрднреА рд╕реБрдмрд╣ рд╣реИ, рдФрд░ рдСрдирд▓рд╛рдЗрди рдореИрдВ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рджреЗрд░ рд╕реЗ рджреЛрдкрд╣рд░ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреВрдВрдЧрд╛ред рддреЛ рдореЗрд░реЗ рдмрд┐рдирд╛ рдЬреНрдпрд╛рджрд╛ рдордд рдХрд░реЛ :)