рдЖрдкрдХрд╛ рджрд┐рди рд╢реБрдн рд╣реЛ!
рдЖрдЦрд┐рд░реА рд╡рд┐рд╖рдп рдореЗрдВ, рдореИрдВрдиреЗ рдкрд╛рдпрдерди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рд╢рд╛рдпрдж рдореЛрдирдб рдХреЛ рдЪрд┐рддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдХрд╛рд░реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдпрд╣ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╡рд┐рд╖рдп рд╕реЗ рдкреВрд░реА рддрд░рд╣ рдЕрдкрд░рд┐рдЪрд┐рдд рд╣реЛрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрдЧрд╛ рдХрд┐ рдХреНрдпрд╛, рдФрд░ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд, рдХреНрдпреЛрдВред рдЗрд╕ рдмрд╛рд░ рдореИрдВ рдЕрдкрдиреА рд╕рдордЭ рдХреЛ рдордЬрдмреВрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рднрд┐рдХреНрд╖реБрдУрдВ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред
рд╕рд╛рдордЧреНрд░реА рдХрд╛рдлреА рд╣рдж рддрдХ
рдЖрдк рдорд╣рд╛рди рдХреЗ рд▓рд┐рдП рд╣рд╛рд╕реНрдХреЗрд▓ рд▓рд░реНрди рдХреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЕрдзреНрдпрд╛рдпреЛрдВ рдХреЛ
рджреЛрд╣рд░рд╛рдПрдЧреА , рд▓реЗрдХрд┐рди рдореЗрд░реА рд╕рдордЭ рдХреЗ рдЪрд╢реНрдореЗ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдФрд░ рдкрд╛рдпрдерди рднрд╛рд╖рд╛ рдХреЗ рдврд╛рдВрдЪреЗ рдХреЗ рднреАрддрд░ред рдореИрдВ рд╕реНрд╡рдпрдВ рдкреБрд╕реНрддрдХ рдХреЛ рдкрдврд╝рдиреЗ рдХреА рдЕрддреНрдпрдзрд┐рдХ рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ, рднрд▓реЗ рд╣реА рдЖрдкрдХреЛ рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрд╛рд░реНрдп рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрдИ рдпреЛрдЬрдирд╛ рдирд╣реАрдВ рд╣реИ: рдЖрдкрдХреЗ рдХреНрд╖рд┐рддрд┐рдЬ рдХрд╛ рдХрд╛рдлреА рд╡рд┐рд╕реНрддрд╛рд░ рд╣реЛрдЧрд╛ред рдореИрдВ рд╢реБрд░реВ рдХрд░реВрдБрдЧрд╛, рд╢рд╛рдпрджред
рдкреНрд░рд╕рдВрдЧ
рдЕрдХреНрд╕рд░, рдкреНрд░реЛрдЧреНрд░рд╛рдо рджреНрд╡рд╛рд░рд╛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдбреЗрдЯрд╛ рдХрд┐рд╕реА рд╕рдВрджрд░реНрдн рдореЗрдВ рд╣реЛрддрд╛ рд╣реИред рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП, рдЖрдк рдЗрд╕реЗ рдПрдХ рдмреЙрдХреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ "рдмреЙрдХреНрд╕рд┐рдВрдЧ" рд╕рд╛рджреГрд╢реНрдп рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдЯреАрдХ рдирд╣реАрдВ рд╣реИ, рдФрд░
рдХрднреА-рдХрднреА рд▓рд╛рдЧреВ рднреА рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдм рд╣рдо рдЗрд╕рдХреЗ рд▓рд┐рдП рдЫрдбрд╝реА рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗ)ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реВрдЪреА рдЙрд╕ рдмреЙрдХреНрд╕ рдХреЗ рд╕рдорд╛рди рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЖрдЗрдЯрдо рд╣реИрдВред рдФрд░ рд╕реВрдЪреА рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрджрд░реНрдн рдмрдирд╛рддреА рд╣реИ - рд╕реВрдЪреА рдЖрдЗрдЯрдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЧрдП рдХрдИ рдСрдкрд░реЗрд╢рди рдЖрдЗрдЯрдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рдХрд┐ рдЙрдиреНрд╣реЗрдВ "рдмрдХреНрд╕реЗ" рдХреЗ рд╕рд╛рде рджреЗрдЦрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рди рдХреЗрд╡рд▓ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рд╣реИред рдлрд╝реАрд▓реНрдб рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдмреЙрдХреНрд╕ рд╡рд╣ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдпреЗ рдлрд╝реАрд▓реНрдб рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВред рд╕рдВрдмрдВрдзрд┐рдд рд╡рд╕реНрддреБрдУрдВ рдкрд░ рдирд┐рд░реНрдорд┐рдд рдПрдХ рдкреЗрдбрд╝ рдЕрдкрдиреА рд╢рд╛рдЦрд╛рдУрдВ / рдкрддреНрддрд┐рдпреЛрдВ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдВрдЯреЗрдирд░ рд╣реИред
рдУрдУрдкреА рдореЗрдВ, рдпрд╣ рдЙрд╕рдХреЗ рдЕрдВрджрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдбреЗрдЯрд╛ рдХреЛ рдПрдирдХреНрд░рд┐рдкреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдерд╛рдЧрдд рд╣реИ, рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХреНрд╕реЗрд╕ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИред рд╡рд┐рднрд┐рдиреНрди рд╡рд░реНрдЧреЛрдВ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рдСрдмреНрдЬреЗрдХреНрдЯ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рдПрдХрдЬреБрдЯ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ, рдХрдо рд╕реЗ рдХрдо рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЗ рдореЗрдВ, рд▓реЗрдХрд┐рди рдЙрди рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рдПрдХ рд╕рдВрджрд░реНрдн ("рдмреЙрдХреНрд╕") рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдбреЗрдЯрд╛ рд╕реНрдерд┐рдд рд╣реИ, рдпрд╣ рдХрд╛рдлреА рд╕рдВрднрд╡ рд╣реИред
рдХрднреА-рдХрднреА рдЖрдкрдХреЛ рдбреЗрдЯрд╛ рдХреЛ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдлрд╝рдВрдХреНрд╢рди рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬреЛ рд╕рд╛рдзрд╛рд░рдг рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╣реЛ рд╕рдХрддреА рд╣реИ, рд▓реЗрдХрд┐рди "рдмреЙрдХреНрд╕" рдХреЗ рдЕрдВрджрд░ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрде рд╣реИред
рдЙрджрд╛рд╣рд░рдг: рдПрдХ рд▓рдЧрд╛-рдЯрд┐рдк рдкреЗрди рдФрд░ рдХрд╛рдЧрдЬ рдХреЗ рдПрдХ рдмреЙрдХреНрд╕ рдХреЗ рд╕рд╛рде, рдПрдХ рдЫреЗрдж рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмреЙрдХреНрд╕ рдореЗрдВ рдПрдХ рд▓рдЧрд╛-рдЯрд┐рдк рдкреЗрди рдЪрд┐рдкрдХрд╛ рдФрд░ рд╡рд╣рд╛рдБ рдХреБрдЫ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИред рддрд╛рд░реНрдХрд┐рдХ рд╕рдорд╛рдзрд╛рди: рдбреЗрдЯрд╛ рдХреЛ рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓реЗрдВ, рдЙрд╕ рдкрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд╛рдЧреВ рдХрд░реЗрдВ, рдФрд░ рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдбрд╛рд▓реЗрдВред
рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдмреЙрдХреНрд╕ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕рд╛рдордЧреНрд░реА рдкрд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрдВрддреНрд░ рд╣реИ, рддреЛ рд╣рдорд╛рд░рд╛ "рдмреЙрдХреНрд╕" рдПрдХ
рдлрд╝рдирдХрд╛рд░ рдмрди рдЬрд╛рддрд╛ рд╣реИред
functors
рддреЛ рдПрдХ рдлрд╝рдВрдХреНрдЯрд░ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрджрд░реНрдн рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдбреЗрдЯрд╛ рд╕реНрдерд┐рдд рд╣реИ, рдФрд░ рдЖрдк рдЗрд╕ рдбреЗрдЯрд╛ рдХреЛ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕ рдкрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╡рд╛рдкрд╕ рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЗрд╡рд▓ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдВрджрд░реНрдн рдХреЗ рд╕рд╛рде рдирд╣реАрдВред
рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╡рд░реНрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ:
class Functor(Infixable): ''' ''' def fmap(self, func): raise NotImplementedError()
рдЬрдмрдХрд┐ рдЖрдкрдХреЛ рдкреВрд░реНрд╡рдЬ (Infixable) рдкрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдлрд┐рд░ рднреА рдЖрдк рдкреВрд░реНрд╡рдЬ рд╡рд╕реНрддреБ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдПрдХ рдлрд╝рдирдХрд╛рд░ рдХреЗ рдЕрдВрджрд░ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рддрдВрддреНрд░ рдлрд╝реИрдореНрдк рд╡рд┐рдзрд┐ рд╣реИред
рд╡реИрд╕реЗ, рдкрд╛рдпрдерди рдореЗрдВ рд╕реВрдЪреА рд╕рдмрд╕реЗ рдордЬреЗрджрд╛рд░ рд╣реИ, рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕реВрдЪреА рдХреА рд╕рд╛рдордЧреНрд░реА рдкрд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрдВрддреНрд░ рдирдХреНрд╢рд╛ () рд╣реИред рдирдХреНрд╢рд╛ (рдПрдмреНрд╕, [-2, -1,0,1,2]) - рдпрд╣ рд╕реВрдЪреА рдХреЗ рддрддреНрд╡реЛрдВ рдХрд╛ рдирд┐рд╖реНрдХрд░реНрд╖рдг рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕реЗ рд╡рд╛рдкрд╕ рд╕реВрдЪреА рдореЗрдВ рдбрд╛рд▓рддрд╛ рд╣реИред
рдПрдХ рдлрд╝рдирдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реВрдЪреА рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ:
class List(Functor): def __init__(self, *items): super(List, self).__init__() self._items = items def fmap(self, func): self._items = map(func, self._items)
рдЕрдм рдЖрдк рдпрд╣ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
>>> print List(-2,-1,0,1,2).fmap(abs).fmap(lambda x: x*2).fmap(str).result ['4', '2', '0', '2', '4']
рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ, рдЯрд╛рдЗрдк рд╕рд┐рд╕реНрдЯрдо рдЖрдкрдХреЛ рдлрд╝рдирдХрд╛рд░ рдкреНрд░рдХрд╛рд░ рд╡рд░реНрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдФрд░ рд╕рднреА рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдЬреЛ рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рд╣реИрдВ (рдФрд░ рд╡реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░, рдЖрдорддреМрд░ рдкрд░, рдХрдИ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд░реНрдЧ рдХреЗ рд╣реИрдВ)ред рдЙрдкрдпреЛрдЧ рдореЗрдВ рдкреНрд░рдХрд╛рд░ рд╡рд░реНрдЧ рд╡рд┐рдзрд┐ рдПрдХ рдирд┐рдпрдорд┐рдд рдХрд╛рд░реНрдп рдХреА рддрд░рд╣ рд▓рдЧрддреА рд╣реИ:
fmap abs [-2,-1,0,1,2]
рдпрд╣ рдХреБрдЫ рд╣рдж рддрдХ рд╕реМрдВрджрд░реНрдпрд╡рд╛рджреА рд╣реИ, рд▓реЗрдХрд┐рди рдкрд╛рдпрдерди рд╕рдВрд╕реНрдХрд░рдг рд▓рд╛рдЧреВ рд╣реИред
рдЕрдм рд╣рдо рд╕рдВрджрд░реНрдн рдореЗрдВ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рдпрдорд┐рдд рдлрд╝рдВрдХреНрд╢рди рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╣рдо рд╕рдВрджрд░реНрдн рдореЗрдВ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐ рд╕рдВрджрд░реНрдн рдореЗрдВ рднреА рд╣реИ (рдбреЗрдЯрд╛ рдХреЗ рд╕рдорд╛рди)ред рдпрд╛рдиреА рдФрд░ рдбреЗрдЯрд╛ рдФрд░ рдбреЗрдЯрд╛ рдХреЗ рдКрдкрд░ рдлрд╝рдВрдХреНрд╢рди рд╕рдВрджрд░реНрдн рдореЗрдВ рд╣реИрдВ: рдПрдХ рдмреЙрдХреНрд╕ рдореЗрдВ рдПрдХ рдорд╣рд╕реВрд╕-рдЯрд┐рдк рдкреЗрди рдФрд░ рдХрд╛рдЧрдЬ рдХреЗ рдЯреБрдХрдбрд╝реЗ рджреЛрдиреЛрдВред рдЖрдкрдХреЛ рдПрдХ рдорд╣рд╕реВрд╕-рдЯрд┐рдк рдкреЗрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХрд╛рдЧрдЬ рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ, рдбреНрд░рд╛ рдХрд░реЗрдВ, рдкрд░рд┐рдгрд╛рдо рд╡рд╛рдкрд╕ рд▓рд╛рдПрдВред рдпрджрд┐ рд╣рдорд╛рд░рд╛ рдмреЙрдХреНрд╕ рдРрд╕рд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдПрдХ
рдРрдкреНрд▓рд┐рдХреЗрдЯрд░ рдлрд╝рдирдХрд╛рд░ рд╣реИ ред
рдпрд╣рд╛рдВ рд╣рдо рдПрдХ рд╕рд╣рд╛рдпрдХ рд╡рд░реНрдЧ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдирд╛рдо рдЗрдиреНрдлрд┐рдХреНрд╕реЗрдмрд▓ рд╣реИ (рдЬреЛ рдХрд┐ рдлрд╝рдиреНрдХреНрдЯрд░ рдХреЗ рдкреВрд░реНрд╡рдЬреЛрдВ рдореЗрдВ рд╣реИ)ред рдФрд░ рдЙрд╕реЗ рдЗрдиреНрдлрд┐рдХреНрд╕ рдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХрд╛ рдПрд╣рд╕рд╛рд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрддрдирд╛
Infix рд╕рдВрдХреЗрддрди
рдкрд╛рдпрдерди рдореЗрдВ рдХрд╕реНрдЯрдо рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕рд╛рдорд╛рдиреНрдп рдЗрдиреНрдлрд┐рдХреНрд╕ рдиреЛрдЯреЗрд╢рди рдирд╣реАрдВ рд╣реИ - рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЬрдореЗ рд╣реБрдП рд╣реИрдВред рдФрд░ рдХрднреА-рдХрднреА рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреБрдЫ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬреИрд╕реЗ:
(/*/) = lambda x,y: (x + y) * (x - y) print 5 /*/ 4 /*/ 3
рдХрд╛рд╢, рдХреЛрдИ рд░рд╛рд╕реНрддрд╛ рдирд╣реАрдВред рдореИрдВрдиреЗ рдПрдХ рд╡рд░реНрдЧ рд▓рд┐рдЦрд╛ рд╣реИ рдЬреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП infix рд╕рдВрдХреЗрддрди рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЦреБрдж рдХрдХреНрд╖рд╛:
class Infixable(object): INFIX_OPS = [{}] def __init__(self): self._last_is_opcode = False self._op = None table = {} for sub_table in self.INFIX_OPS: table.update(sub_table) self._op_table = table def __add__(self, val): if self._last_is_opcode: method = getattr(self, self._op_table[self._op]) method(val) else: self._op = val self._last_is_opcode = not self._last_is_opcode return self
рдЗрд╕ рд╢реНрд░реЗрдгреА рдореЗрдВ + рдСрдкрд░реЗрдЯрд░ рдЕрддрд┐рднрд╛рд░рд┐рдд рд╣реИ, рдФрд░ рд╕рднреА рдирдордХ INFIX_OPS рд╡рд░реНрдЧ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛ рдореЗрдВ рд╕рдорд╛рд╣рд┐рдд рд╣реИред рдпрджрд┐ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд MyObj - Infixable рдХрд╛ рд╡рдВрд╢рдЬ рд╣реИ - mmm (рд╕реНрд╡рдпрдВ, рдорд╛рди) рд╡рд┐рдзрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдФрд░ INFIX_OPS рдХреЛ рдлрд╝реЙрд░реНрдо рдХреЗ рд╢рдмреНрджрдХреЛрд╢ рдХреЗ рд╕рд╛рде рдкреВрд░рдХ рдХрд░рддрд╛ рд╣реИ {'/ * /': 'mmm', ...}, рддреЛ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХреЛ рд░рд┐рдХреЙрд░реНрдб рдХрд░рдиреЗ рдХрд╛ рдпрд╣ рд░реВрдк рд╕рдВрднрд╡ рд╣реЛ рдЬрд╛рдПрдЧрд╛:
obj = MyObj() +'/*/+ 1 +'/*/'+ 2 +'/*/'+ 3
рдмрд╣реБрдд рд╕реБрдВрджрд░ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╢рд╛рдпрдж рддрдм рдореБрдЭреЗ рдХреЛрдИ рд╡рд┐рдХрд▓реНрдк рдорд┐рд▓ рдЬрд╛рдПрдЧрд╛ред
рдПрдкреНрд▓рд╛рдЗрдб рдлрдВрдХреНрд╢рдирд▓
рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ рдмреЙрдХреНрд╕ рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдФрд░ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ, рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдбреЗрдЯрд╛ рдкрд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╡рд╛рдкрд╕ рд▓рд╛рдиреЗ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рд╣рдореЗрдВ рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдлрд╝рдВрдХреНрд╢рдирд▓ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред рд╣рдо рдПрдХ рдЙрдкрдпреБрдХреНрдд рд╡рд░реНрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдорд╛рд░реЗ рдкреВрд░реНрд╡рдЬ рдХреЗ рдкрд╛рд╕ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдлрд╝рдирдХрд╛рд░ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдХрд╛рдЧрдЬ рдХреЗ рдЯреБрдХрдбрд╝реЛрдВ рдФрд░ рдмрд╛рд╣рд░реА рдорд╣рд╕реВрд╕ рдХрд┐рдП рдЧрдП рдкреЗрди рдХреЗ рд╕рд╛рде рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реИред рддреЛ рд╡рд░реНрдЧ:
class Applicative(Functor): INFIX_OPS = Functor.INFIX_OPS + [{ '<*>': 'applicate' }] def applicate(self, value): raise NotImplementedError()
рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рд╡рдВрд╢рдЬреЛрдВ рдХреЛ рдЖрд╡реЗрджрдХ (рдореВрд▓реНрдп) рд╡рд┐рдзрд┐ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧреА рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЗрдиреНрдлрд┐рдХреНрд╕ рдСрдкрд░реЗрдЯрд░ '<*> рд╣реИред
рдКрдкрд░
рд╕реВрдЪреАрдмрджреНрдз рдкреВрд░реНрд╡рдЬреЛрдВ рдХреА
рд╕реВрдЪреА рдХреЛ рдЙрдкрд╛рджреЗрдп рдХреЗ рд╕рд╛рде рдмрджрд▓реЗрдВ рдФрд░ рдирдИ рдкрджреНрдзрддрд┐ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЬреЛрдбрд╝реЗрдВред рдпрд╣ рд╕реВрдЪреА рдШреЛрдВрд╕рд▓реЗ рдХреЗ рд╕реНрддрд░ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╣рд╛рдпрдХ рд╕рдорд╛рд░реЛрд╣ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА ([[рдП, рдмреА], [рд╕реА, рдбреА]] -> [рдП, рдмреА, рд╕реА, рдбреА])ред рд╕рдорд╛рд░реЛрд╣ рдФрд░ рд╡рд░реНрдЧ:
def _concat(lists): return reduce(lambda x, y: x + y, lists, []) class List(Applicative): ...
рдЕрдм рдЖрдк рдпрд╣ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
>>> List(str).applicate(List(1,2,3,4,5)).result ['1', '2', '3', '4', '5']
рдпрд╣рд╛рдВ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЙрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╣реИ рдЬреЛ рд╣рдо рд╕рдВрджрд░реНрдн рдореЗрдВ (рд╕реВрдЪреА рдореЗрдВ) рдбреЗрдЯрд╛ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВред
рд▓реЗрдХрд┐рди, рдФрд░ рдпрд╣ рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рдЖрдк рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ, рдЗрдиреНрдлрд┐рдХреНрд╕ рдиреЛрдЯреЗрд╢рди рд▓рд╛рдЧреВ рдХрд░реЗрдВ):
>>> print ( ... List(str, abs) +'<*>'+ List(-10, -20) ... ).result ['-10', '-20', 10, 20]
рд╣рдореЗрдВ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рднреА рдорд╛рдкрджрдВрдбреЛрдВ рдкрд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓рд╛ред рдФрд░ рдЖрдк рдпрд╣ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
>>> add = lambda x: lambda y: x + y
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╕рднреА рддрд░реНрдХреЛрдВ рдХреЗ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рднреА рдкрд╣рд▓реЗ рддрд░реНрдХреЛрдВ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд░реА рдЬрд╛рддреА рд╣реИрдВ рдФрд░ рджреВрд╕рд░реЗ рддрд░реНрдХ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддреА рд╣реИрдВ, рдЬреЛ рд╕рднреА рджреВрд╕рд░реЗ рддрд░реНрдХреЛрдВ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВ!
рдЕрдм рд╣рдо рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рдВрджрд░реНрдн рдореЗрдВ рд░рдЦрдиреЗ рдФрд░ рд╕рдВрджрд░реНрдн рдореЗрдВ рдореВрд▓реНрдпреЛрдВ рдкрд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИрдВ: рдмреЙрдХреНрд╕ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдкрддреНрд░рдХ рдкрд░, рдмреЙрдХреНрд╕ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдорд╣рд╕реВрд╕ рдХрд┐рдП рдЧрдП рдЯрд┐рдк рдкреЗрди рдХреЛ рдЦреАрдВрдЪрдХрд░, рдЯрд┐рдк-рдЯрд┐рдк рдкреЗрди рдХреЛ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВ, рдЬреЛ рдХрд╛рдЧрдЬ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдЯреБрдХрдбрд╝реЗ рдкрд░ рдЦреАрдВрдЪреЗ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж рд╣реА рд╣рдЯрд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред
рдЕрдм рд╕реНрдерд┐рддрд┐ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ: рд╣рдо рдбреНрд░реЙрдЗрдВрдЧ рдХреЗ рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рдЙрддреНрдкрд╛рджрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдорд╛рди рд▓реАрдЬрд┐рдП рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрдирдкреБрдЯ рд╢реАрдЯ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕рдВрджрд░реНрдн рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмреЙрдХреНрд╕ рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд▓рд╛рдЗрди рдкрд░ рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрдпрд╕реНрдерд▓ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рдмреЙрдХреНрд╕ рд╕реЗ рдирд┐рдХрд╛рд▓реЗ рдЧрдП рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд▓реЗ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рд╕рд╛рде рдХреБрдЫ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдПрдХ рдирдП рдмреЙрдХреНрд╕ (рд╕рдВрджрд░реНрдн) рдореЗрдВ рдбрд╛рд▓ рд╕рдХрддрд╛ рд╣реИред рдлрд╝рдВрдХреНрд╢рди рд╕реНрд╡рдпрдВ рдмреЙрдХреНрд╕ рд╕реЗ рдбреЗрдЯрд╛ рдирд╣реАрдВ рд▓реЗрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХреИрд╕реЗ рдЪреБрдирдирд╛ рд╣реИ, рдФрд░ рдпрд╣ рдЗрддрдирд╛ рд╕рд░рд▓ рд╣реИ - рдХрд┐ рдЙрдиреНрд╣реЛрдВрдиреЗ рдЗрд╕реЗ рджрд┐рдпрд╛ рдФрд░ рдЗрд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛, рдФрд░ рдЗрд╕реЗ рдПрдХ рдирдП рдЦрд╛рд▓реА рдмреЙрдХреНрд╕ рдореЗрдВ рдбрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдСрдкрд░реЗрд╢рди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдПрдХреАрдХреГрдд рд╣реИ: рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдбреЗрдЯрд╛ -> рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг -> рдмреЙрдХреНрд╕ред рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдкрд┐рдЫрд▓реЗ рдмреЙрдХреНрд╕ рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдПрдХ рдирдпрд╛ рдмреЙрдХреНрд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рди рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХреЛ рд╕рдВрджрд░реНрдн (
рдореЛрдиреИрдбрд┐рдХ рдорд╛рди ) рдореЗрдВ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдПрдХ
рдореЛрдирдбрд┐рдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╣рд▓рд╛рддрд╛ рд╣реИред рдФрд░ рдПрдХ рдЖрд╡реЗрджрдХ рдлрд╝рдирдХрд╛рд░, рдЬреЛ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдореВрд▓реНрдп рд▓реЗ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдореЛрдирд╛рдбрд┐рдХ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╕реЗ рдЧреБрдЬрд░ рд╕рдХрддрд╛ рд╣реИ, рд╡рд╣ рд╣реИ
рдореЛрдирд╛рдб ред
рдЗрдХрд╛рдИ
рдореЛрдиреЛрдЯрд╛рдЗрдк рдХреНрд▓рд╛рд╕ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк:
class Monad(Applicative): INFIX_OPS = Applicative.INFIX_OPS + [{ '>>=': 'bind', '>>': 'then', }] def bind(self, monad_func): raise NotImplementedError() def then(self, monad_func): raise NotImplementedError() @property def result(self): raise NotImplementedError()
рд╕рдиреНрдпрд╛рд╕реА 2 рддрд░реАрдХреЗ рдмрд╛рдБрдз (>> =) рдФрд░ рдлрд┐рд░ (>>) рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
рдмрд╛рдЗрдВрдб () рдХреЛ рд╕рдВрджрд░реНрдн рд╕реЗ рдорд╛рди рдорд┐рд▓рддрд╛ рд╣реИ, рдореЛрдирд╛рдб рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЕрдЧрд▓рд╛ рдорд╛рди (рдореЛрдирдб рд╡реИрд▓реНрдпреВ) рд▓реМрдЯрд╛рддрд╛ рд╣реИред
рддрдм () рдкрд┐рдЫрд▓реЗ рдореЛрдирдб рдореВрд▓реНрдп рдХреЛ рддреНрдпрд╛рдЧрддрд╛ рд╣реИ, рдмрд┐рдирд╛ рдХрд┐рд╕реА рддрд░реНрдХ рдХреЗ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдирдП рдорд╛рди рдореВрд▓реНрдп рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддрд╛ рд╣реИред
рдореЛрдирд╛рдж рд╕реВрдЪреА
рдЕрдм,
рд╕реВрдЪреА рдХрд╛ рдкреВрд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣рдорд╛рд░реЗ рд╕рд╛рдордиреЗ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛:
def _concat(lists): return reduce(lambda x, y: x + y, lists, []) class List(Monad): def __init__(self, *items): super(List, self).__init__() self._items = items def fmap(self, func): self._items = map(func, self._items) return self def applicate(self, monad_value): self._items = _concat([ map(fn, monad_value._items) for fn in self._items ]) return self def bind(self, monad_func): self._items = _concat(map(lambda x: monad_func(x)._items, self._items)) return self def then(self, monad_func): self._items = monad_func()._items return self @property def result(self): return self._items liftList = lambda fn: lambda x: List( *(fn(x)) )
LifList рд╕рдВрджрд░реНрдн рдореЗрдВ рдПрдХ рдирд┐рдпрдорд┐рдд рдХрд╛рд░реНрдп рдХреЛ "рдЦреАрдВрдЪрддрд╛ рд╣реИ": "рдЦреАрдВрдЪрд╛" рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдорд╛рди рдореВрд▓реНрдп рджреЗрддрд╛ рд╣реИ
рдФрд░ рдпрд╣рд╛рдВ рдПрдХ рдореЛрдирдб рдХреЗ рд░реВрдк рдореЗрдВ рд╕реВрдЪреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ: рдХрд╛рд░реНрдп рдпрд╣ рдЬрд╛рдВрдЪрдирд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рд╢рддрд░рдВрдЬ рдХреЗ рдмреЛрдб рдкрд░ рдПрдХ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдмрд┐рдВрджреБ рд╕реЗ рджреВрд╕рд░реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдмрд┐рдВрджреБ рддрдХ рдШреЛрдбрд╝реЗ рдХреЗ рд╕рд╛рде 3 рдЪрд╛рд▓ рдЪрд▓реЗрдВред
рд╢рд╛рдпрдж рдореЛрдирд╛рдж
рд╢рд╛рдпрдж рдореЛрдирд╛рдж рдПрдХ рд╕рдВрджрд░реНрдн рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдорд╛рдирдж рдореВрд▓реНрдп рджреЛ рд░рд╛рдЬреНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ:
- рдкрд┐рдЫрд▓рд╛ рдЪрд░рдг рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкреВрд░рд╛ рд╣реБрдЖ, рдХреБрдЫ рдореВрд▓реНрдп (рд╕рд┐рд░реНрдл x) рдХреЗ рд╕рд╛рде
- рдкрд┐рдЫрд▓рд╛ рдЪрд░рдг рд╡рд┐рдлрд▓ (рдХреБрдЫ рднреА рдирд╣реАрдВ)
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╢рд╛рдпрдж рдореЛрдирдб рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЧрдгрдирд╛ рдХрд╛ рдХреНрд░рдо рдЪрд░рдгреЛрдВ рдХрд╛ рдПрдХ рдХреНрд░рдо рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдкрд┐рдЫрд▓реЗ рдПрдХ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдХреЛрдИ рднреА рдХрджрдо рд╡рд┐рдлрд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рдкреВрд░реЗ рдЕрдиреБрдХреНрд░рдо рдХрд╛ рдЕрд╕рдлрд▓ рд╕рдорд╛рдкрди рд╣реЛрдЧрд╛ред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдпрджрд┐ рдХрд┐рд╕реА рднреА рдХрджрдо рдкрд░ рдПрдХ рдЕрд╕рдлрд▓ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдмрд╛рдж рдХреЗ рдХрджрдо рдЕрд░реНрдерд╣реАрди рдХреЗ рд░реВрдк рдореЗрдВ рдЫреЛрдбрд╝ рджрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдлрдВрдХреНрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ, рд╡реЗ рдлреИрдВрдк рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдорд╛рди рдкрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд╛рдЧреВ рдХрд░реЗрдВрдЧреЗ, рдпрджрд┐ рдХреЛрдИ рдорд╛рди рд╣реИ, рддреЛ рдХреЛрдИ рдореВрд▓реНрдп рдирд╣реАрдВ рд╣реИ (рдЕрд╕рдлрд▓ рдкрд░рд┐рдгрд╛рдо) - рдЗрд╕рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ, рдареАрдХ рд╣реИ, рдпрд╣ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ!
рдпрджрд┐ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╕рдВрджрд░реНрдн-рд╕рдВрджрд░реНрдн рдФрд░ рддрд░реНрдХреЛрдВ рдХреЗ рдЕрдВрджрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ (рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдПрдХ рдРрдкреНрд▓рд┐рдХреЗрдЯрд░ рдлрд╝рдВрдХреНрдЯрд░ рдХреА рддрд░рд╣), рддреЛ рдлрд╝рдВрдХреНрд╢рди рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдпрджрд┐ рдпрд╣ рд╣реИ рдФрд░ рд╕рднреА рддрд░реНрдХ рд╣реИрдВ, рдЕрдиреНрдпрдерд╛ рдкрд░рд┐рдгрд╛рдо рддреБрд░рдВрдд рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред
рд╢рд╛рдпрдж рдореЛрдирд╛рдж рдХреНрд▓рд╛рд╕:
class Maybe(Monad): def __init__(self, just=None, nothing=False): super(Maybe, self).__init__() self._just = just self._nothing = nothing def fmap(self, func): if not self._nothing: self._just = func(self._just) return self def applicate(self, monad_value): if not self._nothing: assert isinstance(monad_value, Maybe) app_nothing, just = monad_value.result if app_nothing: self._nothing = True else: self._just = self._just(just) return self def bind(self, monad_func): if not self._nothing: monad_value = monad_func(self._just) assert isinstance(monad_value, Maybe) nothing, just = monad_value.result if nothing: self._nothing = True else: self._just = just return self def then(self, monad_func): monad_value = monad_func() assert isinstance(monad_value, Maybe) self._nothing, just = monad_value.result if not self._nothing: self._just = just return self @property def result(self): return (self._nothing, self._just) just = lambda x: Maybe(just=x) nothing = lambda: Maybe(nothing=True) liftMaybe = lambda fn: lambda x: just(fn(x))
рдмрд╕ (x) рдФрд░ рдХреБрдЫ рдирд╣реАрдВ () рдЕрдзрд┐рдХ рдЖрд╕рд╛рдиреА рд╕реЗ рдореЗрд▓ рдЦрд╛рддреЗ рдореЛрдирд╛рдб рдорд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╢реЙрд░реНрдЯрдХрдЯ рд╣реИрдВред LifMaybe - рд╢рд╛рдпрдж рд╕рдВрджрд░реНрдн рдореЗрдВ "рдЦреАрдВрдЪ"ред
рдПрдХ рдлрдирдХрд╛рд░ рдФрд░ рдПрдкреЗрдХреНрдЯрд┐рд╡ рдлрдиреНрдХреНрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдг:
def showMaybe(maybe): nothing, just = maybe.result if nothing: print "Nothing!" else: print "Just: %s" % just
рдореИрдВ рд╢рд╛рдпрдж рднрд┐рдХреНрд╖реБрдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреВрдВрдЧрд╛ред рдПрдХ рдХрд╕рдХрд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рд░рд╕реНрд╕реА рдХреЗ рд╕рд╛рде рдПрдХ рдкреЛрд▓ рдХреЗ рд╕рд╛рде рдЪрд▓рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкрдХреНрд╖реА рдПрдХ рдкреЛрд▓ рдкрд░ рдмреИрдардирд╛ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рд╡реЗ рдЙрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдХрд╕рдХрд░ рдЪрд▓рдиреЗ рд╡рд╛рд▓рд╛ рд╡реЙрдХрд░ рдЕрдкрдирд╛ рд╕рдВрддреБрд▓рди рдмрдирд╛рдпреЗ рд░рдЦ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рдкреЛрд▓ рдХреЗ рдХрд┐рдирд╛рд░реЛрдВ рдкрд░ рдкрдХреНрд╖рд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЕрдВрддрд░ 4 рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реИред рд╡реИрд╕реЗ, рдмреИрд░реЛрдк рд╡реЙрдХрд░ рдмрд╕ рдХреЗрд▓реЗ рдХреЗ рдЫрд┐рд▓рдХреЗ рдкрд░ рдлрд┐рд╕рд▓ рдХрд░ рдЧрд┐рд░ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ "рдЧрд┐рд░" / "рдЧрд┐рд░ рдирд╣реАрдВ рдерд╛" рдХреЗ рд░реВрдк рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд╕рд╛рде рдШрдЯрдирд╛рдУрдВ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХреЛ рдЕрдиреБрдХрд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдХреЛрдб:
рдПрдХ рдЖрдлреНрдЯрд░рд╡рд░реНрдб рдХреЗ рдмрдЬрд╛рдп
рдЗрд╕реА рддрд░рд╣, рдЖрдк рдЕрдиреНрдп рдкреНрд░рд╕рд┐рджреНрдз рдордареЛрдВ, рдпрд╛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдХреБрдЫ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЖрдк рдХреЗрд╡рд▓ рдПрдХ рдлрд╝рдирдХрд╛рд░ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рдВрдмрдВрдзрд┐рдд рд╡рд╕реНрддреБрдУрдВ рдкрд░ рдПрдХ рдкреЗрдбрд╝ рдХреЗ рд▓рд┐рдПред
рдЯрд┐рдкреНрдкрдгреА
рдореИрдВрдиреЗ рдЬрд╛рдирдмреВрдЭрдХрд░ рдореЛрдирд╛рдж рдХрд╛рдиреВрдиреЛрдВ рдХреЗ рд╡рд┐рд╖рдп рдХреЛ рдирд╣реАрдВ рдЫреБрдЖ, рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд┐рд╖рдп рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрдбрд╝рд╛ рдерд╛ред рдЕрдЧрд▓реА рдмрд╛рд░ рдХреБрдЫ рдмрддрд╛рдирд╛ рд╣реЛрдЧрд╛ред
рдмрджрд▓рд╛
рдЯрд┐рдкреНрдкрдгреА рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж (рдзрдиреНрдпрд╡рд╛рдж, рдХрд╡рдХ) рдореИрдВрдиреЗ рд▓рд┐рд╕реНрдЯ рдореЛрдирд╛рдж рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдореЛрдирдб рдХрд╛рд░реНрдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП рдореВрд▓реНрдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд░реЛрдзрд╛рднрд╛рд╕ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░ рджрд┐рдпрд╛ред рдЕрдм рдЙрдиреНрд╣реЗрдВ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рд╕реВрдЪреА рдЙрджрд╛рд╣рд░рдг рдмрд┐рд▓реНрдХреБрд▓ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдирдпрд╛ рд╕рдВрд╕реНрдХрд░рдг
рдпрд╣рд╛рдБ рдЭреВрда рдмреЛрд▓рддрд╛ рд╣реИ ред
рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХрд╛ рд╡рд┐рд╡рд░рдг:
- рдЗрдиреНрдлрд┐рдХреНрд╕ рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ - рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмреБрд░рд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИ
- рдлрд╝рдирдХрд╛рд░ рдФрд░ рдореЛрдирд╛рдб рд╡рд┐рдзрд┐рдпрд╛рдБ рдЕрдм рдирдП рд╕рдВрджрд░реНрдн рдорд╛рдиреЛрдВ рдХреЛ рд▓реМрдЯрд╛рддреА рд╣реИрдВ, рдмрдЬрд╛рдп рдХрд┐ рдЗрдирдХрдо рд╕рдВрджрд░реНрдн рдХреЛ рдмрджрд▓рдиреЗ рдХреЗред
- рд╕реВрдЪреА рдореЛрдирд╛рдж рдЕрдм рд╕реВрдЪреА рдХрд╛ рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░реА рд╣реИред рддреЛ рдорд╛рдирд╕ рдкрд░рд┐рдгрд╛рдо рднреА рдПрдХ рд╕реВрдЪреА рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЖрдк рдПрдХ рд╕реВрдЪреА рд▓реМрдЯрд╛рдиреЗ рд╡рд╛рд▓реЗ рдореМрджреНрд░рд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд░рд╛рдХреНрд╖рд╕реА рдЕрдиреБрдХреНрд░рдо рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдХрд╛рд░реНрдп рдЖрд╡рд╢реНрдпрдХ рдФрд░ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред