рдПрдХ рдФрд░ рдореЛрдирд╛рдж рдЧрд╛рдЗрдб (рднрд╛рдЧ 4: рд╢рд╛рдпрдж рдореЛрдирд╛рдж рдФрд░ рд╕реВрдЪреА рдореЛрдирд╛рдж)

рдорд╛рдЗрдХ рд╡рдирд┐рдпрд░ рджреНрд╡рд╛рд░рд╛

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

рд╢рд╛рдпрдж рдореЛрдирд╛рдж



рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдореЛрдирд╛рдж рдЖрдорддреМрд░ рдкрд░ рд╣рд╛рд╕реНрдХреЗрд▓ рдирд┐рдпрдорд╛рд╡рд▓реА рдореЗрдВ рдкреЗрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдирд╛, рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдФрд░ рд╕рдордЭрдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╢рд╛рдпрдж рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдкрд░рд┐рднрд╛рд╖рд╛ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ:

рдбреЗрдЯрд╛ рд╢рд╛рдпрдж рдП = рдХреБрдЫ рдирд╣реАрдВ | рдмрд╕ рдП


рдЗрд╕рдореЗрдВ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╣реЛ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ (рд╡рд┐рд╢рд┐рд╖реНрдЯ) рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдкреНрд░рдХрд╛рд░ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡реЗ рдпрд╣ рднреА рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╢рд╛рдпрдж рдПрдХ "рдмрд╣реБрд░реВрдкрд┐рдпрд╛" рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИ, рдЕрд░реНрде рд╕рдорд╛рди рд╣реИред рддреЛ, рдЕрдЧрд░ рдПрдХ рдЗрдВрдЯ рдереЗ, рддреЛ рд╣рдореЗрдВ рдорд┐рд▓реЗрдЧрд╛:

рдбреЗрдЯрд╛ рд╢рд╛рдпрдж Int = рдХреБрдЫ рдирд╣реАрдВ | рдмрд╕ int


рдХреЗрд╡рд▓ рдЕрдм рд╣рдореЗрдВ рдЗрд╕реЗ рд╕реАрдзреЗ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЙрдкрд░реЛрдХреНрдд рд╕рд╛рд░ рдкрд░рд┐рднрд╛рд╖рд╛ рд╕рднреА рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддреА рд╣реИред

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

рд╢рд╛рдпрдж рдмрд╣реБрд░реВрдкрд┐рдпрд╛ рдкреНрд░рдХрд╛рд░ рдЙрдкрдпреЛрдЧреА рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕реЗ рдПрдХ "рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдлрд╝рдВрдХреНрд╢рди" рдХреЗ рдореЙрдбрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдпрд╛ рддреЛ рдЖрдЙрдЯрдкреБрдЯ рдореВрд▓реНрдп рдпрд╛ рдХреНрд░реИрд╢ рдХреЗ рд░реВрдк рдореЗрдВ рдХреБрдЫ рдкреИрджрд╛ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХрд┐рд╕реА рднреА рдореВрд▓реНрдп рдХреЛ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред (рдЕрд░реНрдерд╛рддреН, рдРрд╕рд╛ рдХрд╛рд░реНрдп рд╡рд┐рдлрд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред) рдпрд╣ рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ:

f :: a -> рд╢рд╛рдпрдж b


рдлрд╝рдВрдХреНрд╢рди f рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдорд╛рди рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдпрд╛ рддреЛ рдХреБрдЫ рднреА рдирд╣реАрдВ рд▓реМрдЯрд╛рддрд╛ рд╣реИ (рд╡рд┐рдлрд▓рддрд╛ рдХрд╛ рд╕рдВрдХреЗрдд) рдпрд╛ рдорд╛рди Just x , рдЬрд╣рд╛рдБ x рдХрд╛ рдкреНрд░рдХрд╛рд░ b рд╣реИ ред рдПрдл рдЬреИрд╕реЗ рдХрд╛рд░реНрдп рд╢рд╛рдпрдж рдореЛрдирд╛рдб рдореЗрдВ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ, рдФрд░ рджреЛ рдРрд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╕рдВрд░рдЪрдирд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

f :: a -> рд╢рд╛рдпрдж b - рдорд╛рди рд▓реЗрдВ рдХрд┐ f рдХреЛ рдХрд╣реАрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
g :: b -> рд╢рд╛рдпрдж c - рдорд╛рди рдЬреА рдХрд╣реАрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИ

h :: a -> рд╣реЛ рд╕рдХрддрд╛ рд╣реИ c - f рдФрд░ g рдХреА рдореЛрдирдбрд┐рдХ рд░рдЪрдирд╛ рд╣реЛ
h = f > => g - рдпрд╛рдж рд░рдЦреЗрдВ:> => monadic рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рд╕рдВрдЪрд╛рд▓рдХ рд╣реИ


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

рдЙрджрд╛рд╣рд░рдг рдореЛрдирд╛рдж рд╢рд╛рдпрдж рдЬрд╣рд╛рдБ
( >> = ) = {- рдкрд░рд┐рднрд╛рд╖рд╛ >> = рд╢рд╛рдпрдж рдХреЗ рд▓рд┐рдП -}
рд╡рд╛рдкрд╕реА = {- рд╢рд╛рдпрдж рдХреЗ рд▓рд┐рдП рд╡рд╛рдкрд╕реА рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ -}


рд╣рдо (>> =) рдХреИрд╕реЗ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ ?

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо >> = рдХреЗ рд▓рд┐рдП рдкрд░рд┐рднрд╛рд╖рд╛ рд░реВрдкрд░реЗрдЦрд╛ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдЯрд╛рдЗрдк рдХреЗ рдПрдХ рдмрд╛рдПрдВ рдСрдкрд░реЗрдВрдб рдХреЗ рджреЛ рд╕рдВрднрд╛рд╡рд┐рдд рдорд╛рдорд▓реЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░рддреЗ рд╣реИрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ :

рдХреБрдЫ рдирд╣реАрдВ = = f = {- рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ -}
рдмрд╕ x >> = f = {- рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ -}


рдЬрд╣рд╛рдБ x рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реИ ред рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдмрд╛рдИрдВ рдУрд░ рдПрдХ рдФрд░ рддрд░реАрдХреЗ рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

( >> = ) рдХреБрдЫ рдирд╣реАрдВ f = {- рдЬреЛрдбрд╝реЗ рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ -}
( >> = ) ( рдмрд╕ x ) f = {- рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ -}


рд▓реЗрдХрд┐рди рдпрд╣ рдмреЗрд╣рддрд░ рд╣реИ рдЕрдЧрд░ рдСрдкрд░реЗрдЯрд░ (>> =) рдХреЛ рдПрдХ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ, рдФрд░ рд╣рд╛рд╕реНрдХреЗрд▓ рд╣рдореЗрдВ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рдЗрд╕ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рд╣рдо рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪреЗрдВ рдХрд┐ рд╣рдо рд╢рд╛рдпрдж рдореЛрдирд╛рдб рдореЗрдВ рдореЛрдиреИрдбрд┐рдХ рд░рдЪрдирд╛ рд╕реЗ рдХреНрдпрд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЪрд▓реЛ рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ f рдФрд░ g рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рд▓реЗрддреЗ рд╣реИрдВ, рдЬреЛ рдЙрдиреНрд╣реЗрдВ рдорд┐рд▓рд╛рддреЗ рд╣реИрдВ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ:

f :: a -> рд╢рд╛рдпрдж b
g :: b -> рд╢рд╛рдпрдж c
h :: a -> рд╢рд╛рдпрдж c
h = f > => рдЬреА


рдпрджрд┐ рд╣рдо рдлрд╝рдВрдХреНрд╢рди f рдХреЗ рд▓рд┐рдП рдПрдХ рддрд░реНрдХ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рдХреБрдЫ рднреА рдирд╣реАрдВ рд▓реМрдЯрд╛рддрд╛ рд╣реИ (рдЕрд░реНрдерд╛рдд рдпрд╣ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ), рддреЛ рдлрд╝рдВрдХреНрд╢рди h рдХреЛ рдХреНрдпрд╛ рд▓реМрдЯрдирд╛ рдЪрд╛рд╣рд┐рдП?

f x = рдХреБрдЫ рднреА рдирд╣реАрдВ
h x = ( f > => g ) x = ???


рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдпрджрд┐ fx рдХреБрдЫ рднреА рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ, рддреЛ h рдХреЛ рднреА рдХреБрдЫ рдирд╣реАрдВ рд▓реМрдЯрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдпрджрд┐ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдХреЛрдИ рднрд╛рдЧ (рдлрд╝рдВрдХреНрд╢рди f ) рдкрд░рд┐рдгрд╛рдо рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рд╕рдВрдкреВрд░реНрдг рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ (рдлрд╝рдВрдХреНрд╢рди h ) рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдЧреАред рдПрдХрдорд╛рддреНрд░ рд╡рд┐рдХрд▓реНрдк рдЬрдм h рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдЬрдм f рдкрд░рд┐рдгрд╛рдо рд▓реМрдЯрд╛рддрд╛ рд╣реИ (рдЪрд▓реЛ рдЗрд╕реЗ y рдХрд╣рддреЗ рд╣реИрдВ), рдЗрд╕реЗ рдлрд╝рдВрдХреНрд╢рди g рдХреЛ рдкрд╛рд╕ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ gy рдХрд╛ рд╕рд╣реА рдкрд░рд┐рдгрд╛рдо рднреА рд╣реЛрдЧрд╛ред рдпрджрд┐ f рдпрд╛ g рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ, рддреЛ h рднреА рд╡рд┐рдлрд▓ рд╣реЛрдЧрд╛, рдЕрд░реНрдерд╛рдд hx рдХреА рдЧрдгрдирд╛ рдХреБрдЫ рдирд╣реАрдВ рд╣реЛрдЧреАред

рдЗрд╕реЗ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП, h рдХреА рд╣рдорд╛рд░реА рдкрд░рд┐рднрд╛рд╖рд╛ рд╕реЗ рд╣рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ:

h = f > => рдЬреА
h = \ x -> ( f x >> = g ) - рд╕рдорддреБрд▓реНрдп (рдкрд░рд┐рднрд╛рд╖рд╛ рд╕реЗ = =>)
h x = f x >> = g - рд╕рдордХрдХреНрд╖
- рдорд╛рди рд▓реАрдЬрд┐рдП f x == рдХреБрдЫ рднреА рдирд╣реАрдВ
h x = ( рдХреБрдЫ рдирд╣реАрдВ >> = рдЬреА )
= рдХреБрдЫ рднреА рдирд╣реАрдВ
- рдЗрд╕ рддрд░рд╣ рд╕реЗ:
рдХреБрдЫ рдирд╣реАрдВ = = рдЬреА = рдХреБрдЫ рдирд╣реАрдВ


рдЕрдм рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдСрдкрд░реЗрдЯрд░ (>> =) рдХреБрдЫ рднреА рдирд╣реАрдВ рддрд░реНрдХ рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рддрд╛ рд╣реИ - рдпрд╣ рдХреЗрд╡рд▓ рдХреБрдЫ рднреА рдирд╣реАрдВ рд▓реМрдЯрд╛рддрд╛ рд╣реИ:

рдХреБрдЫ рдирд╣реАрдВ = = f = рдХреБрдЫ рднреА рдирд╣реАрдВ
рдмрд╕ x >> = f = {- рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ -}


рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдореИрдВрдиреЗ g рдХреЛ рдпрд╣рд╛рдБ f рд╕реЗ рдмрджрд▓ рджрд┐рдпрд╛ рд╣реИ , рдФрд░ рдпрд╣ рд╕рд╣реА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдирд╛рдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИрдВред рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рд╣рдо рдЖрдо рддреМрд░ рдкрд░ рдлрд╝рдВрдХреНрд╢рди рдирд╛рдореЛрдВ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рддреЗ рд╣реИрдВ, рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ, рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╡рд┐рд╢реЗрд╖ рдСрдкрд░реЗрдЯрд░ _ (рдЕрдВрдбрд░рд╕реНрдХреЛрд░) рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ, рдЬреИрд╕реЗ:

рдХреБрдЫ рдирд╣реАрдВ = = _ = рдХреБрдЫ рднреА рдирд╣реАрдВ


рдпрд╣ рджреВрд╕рд░реЗ рд╕рдореАрдХрд░рдг рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЕрднреА рднреА рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдЪ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред

рдЕрдм рджреВрд╕рд░реЗ рд░рд╛рд╕реНрддреЗ рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВред рдпрджрд┐ fx рд╡рд┐рдлрд▓ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдкрд░рд┐рдгрд╛рдо рдХреБрдЫ y рдХреЗ рд▓рд┐рдП Just y рдХрд╛ рдореВрд▓реНрдп рд╣реЛрдЧрд╛ред рд╣рдореЗрдВ рдмрд╕ y рд╕реЗ y рдХреЗ рдореВрд▓реНрдп рдХреЛ "рдЕрдирдкреИрдХ" рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдо рддрдм рдлрдВрдХреНрд╢рди g рдореЗрдВ рдкрд╛рд╕ рдХрд░реЗрдВрдЧреЗ, рдФрд░ gy рдкреВрд░реЗ рдлрдВрдХреНрд╢рди h рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИ:

h = f > => рдЬреА
h = \ x -> ( f x >> = g ) - рд╕рдорддреБрд▓реНрдп (рдкрд░рд┐рднрд╛рд╖рд╛ рд╕реЗ = =>)
h x = f x >> = g - рд╕рдордХрдХреНрд╖
- рдорд╛рди рд▓реАрдЬрд┐рдП f x == рдмрд╕ y
h x = ( рдмрд╕ y >> = g )
= рдЬреА рд╡рд╛рдИ


рдЬреЛ рд╣рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд╛ рдХрд╛ рджреВрд╕рд░рд╛ рднрд╛рдЧ рджреЗрддрд╛ рд╣реИ:

рдХреБрдЫ рдирд╣реАрдВ = = f = рдХреБрдЫ рднреА рдирд╣реАрдВ
рдмрд╕ x >> = f = f x


рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдореИрдВрдиреЗ y рдХреЛ x рдФрд░ g рдХреЛ f рдХреЗ рд╕рд╛рде рдмрджрд▓ рджрд┐рдпрд╛ рд╣реИред рдЬрдм рддрдХ рдЖрдк рд╕рдВрдЧрдд рд╣реИрдВ рддрдм рддрдХ рдЪрд░ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдирд╛рдо рдорд╛рдпрдиреЗ рдирд╣реАрдВ рд░рдЦрддреЗред

рдпрд╣ рд╢рд╛рдпрдж рдореЛрдирдб рдХреЗ рд▓рд┐рдП >> = рдСрдкрд░реЗрдЯрд░ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред рдЕрдм рд╣рдореЗрдВ рдЗрд╕ рд╕рдиреНрдпрд╛рд╕реА рдХреЗ рд▓рд┐рдП рд╡рд╛рдкрд╕реА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

рд╡рд╛рдкрд╕реА x = ???


рдПрдХреНрд╕ рдХреЗ рдХрд┐рд╕реА рднреА рдореВрд▓реНрдп рдХреЗ рд▓рд┐рдПред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреНрдпрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ? рд╣рдо рдмрд╕ рдЗрддрдирд╛ рд╣реА рдХрд╣ рд╕рдХрддреЗ рдереЗ

рд╡рд╛рдкрд╕реА x = рдХреБрдЫ рднреА рдирд╣реАрдВ


рдХрд┐рд╕реА рднреА рдПрдХреНрд╕ рдХреЗ рд▓рд┐рдП ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЕрдЧрд░ рд╣рдордиреЗ рдРрд╕рд╛ рдХрд┐рдпрд╛ рддреЛ рд╣рдо рдореЛрдирд╛рдж рдХрд╛рдиреВрдиреЛрдВ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░реЗрдВрдЧреЗ:

рд╡рд╛рдкрд╕реА x >> = f == f x
рдХреБрдЫ рдирд╣реАрдВ >> = f == f x
рдХреБрдЫ рдирд╣реАрдВ == f x - рдЧрд▓рдд!


рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ рдХрдо рд╕реЗ рдХрдо рдХреБрдЫ рдПрдлрдПрдХреНрд╕ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдорд╛рдирджрдВрдб рдлрд╝рдВрдХреНрд╢рди рдПрдлрдПрдХреНрд╕ = рдЬрд╕реНрдЯ рдПрдХреНрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ), рд╣рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИред рдПрдХ рдФрд░ рд╡рд┐рдХрд▓реНрдк рд╣реИ:

рд░рд┐рдЯрд░реНрди рдПрдХреНрд╕ = рдЬрд╕реНрдЯ рдПрдХреНрд╕


рдФрд░ рдпрд╣ рдорда рдХреЗ рдХрд╛рдиреВрдиреЛрдВ рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ:

рд╡рд╛рдкрд╕реА x >> = f
= ( рдмрд╕ x ) >> = рдПрдл - рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд╢рд╛рдпрдж рдореЛрдирд╛рдб рдХреЗ рд▓рд┐рдП рд╡рд╛рдкрд╕реА
= рдПрдл x - рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ = = рдорда рдХреЗ рд▓рд┐рдП рд╢рд╛рдпрдж
- рдкрд╣рд▓реЗ рдореЛрдирд╛рдб рдХрд╛рдиреВрди рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди

рдмрд╕ x >> = рд╡рд╛рдкрд╕реА
= рд╡рд╛рдкрд╕реА x - рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ = = рд╢рд╛рдпрдж рд╕рдиреНрдпрд╛рд╕реА рдХреЗ рд▓рд┐рдП
= рдмрд╕ x - рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд╢рд╛рдпрдж рдореЛрдирдб рдХреЗ рд▓рд┐рдП рд╡рд╛рдкрд╕ рд▓реМрдЯреЗрдВ
- рджреВрд╕рд░реЗ рдореЛрдирд╛рдб рдХрд╛рдиреВрди рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди

рдХреБрдЫ рдирд╣реАрдВ >> = рд╡рд╛рдкрд╕
= рдХреБрдЫ рднреА рдирд╣реАрдВ - рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рджреНрд╡рд╛рд░рд╛ = рд╢рд╛рдпрдж рдореЛрдирдж рдХреЗ рд▓рд┐рдП
- рджреВрд╕рд░реЗ рдореЛрдирд╛рдб рдХрд╛рдиреВрди рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


рдПрдХ рдмрд╛рд░ рдХрд╛рдиреВрдиреЛрдВ рдХрд╛ рд╕рдореНрдорд╛рди рд╣реЛ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж рд╣рдо рдЗрд╕рдХрд╛ рд╡рд┐рдХрд▓реНрдк рд▓реЗрдВрдЧреЗред рд╢рд╛рдпрдж рдореЛрдирдж рдХреА рдкреВрд░реА рдкрд░рд┐рднрд╛рд╖рд╛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИ:

рдЙрджрд╛рд╣рд░рдг рдореЛрдирд╛рдж рд╢рд╛рдпрдж рдЬрд╣рд╛рдБ
рд╡рд╛рдкрд╕реА x = рдмрд╕ x

рдХреБрдЫ рдирд╣реАрдВ = = f = рдХреБрдЫ рднреА рдирд╣реАрдВ
рдмрд╕ x >> = f = f x


рд╡рд╛рд╣! рд╣рдордиреЗ рд╕рд┐рд░реНрдл рдЕрдкрдирд╛ рдкрд╣рд▓рд╛ рдореЛрдирд╛рдб рдмрдирд╛рдпрд╛!

рдмрд╕ рдЦреБрдж рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдпрд╣ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░реЗрдВрдЧреЗ рдХрд┐ рдпрд╣ рддреАрд╕рд░реЗ рд╡рд┐рд╡рд╛рджрд╛рд╕реНрдкрдж рдХрд╛рдиреВрди рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ:

( mv >> = f ) >> = g == mv >> = ( \ x -> ( f x >> = g ) )


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдиреВрди рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ рдЬрдм mv = рдХреБрдЫ рдирд╣реАрдВ:

( рдХреБрдЫ рднреА рдирд╣реАрдВ ) = рдПрдл ) >> = рдЬреА - рдмрд╛рдИрдВ рдУрд░
= рдХреБрдЫ рдирд╣реАрдВ = = рдЬреА - рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рджреНрд╡рд╛рд░рд╛ = =
= рдХреБрдЫ рднреА рдирд╣реАрдВ - рдкрд░рд┐рднрд╛рд╖рд╛ рд╕реЗ = =

рдХреБрдЫ рдирд╣реАрдВ >> = ( \ x -> ( f x >> = g ) ) - рджрд╛рдИрдВ рдУрд░
= рдХреБрдЫ рднреА рдирд╣реАрдВ - рдкрд░рд┐рднрд╛рд╖рд╛ рд╕реЗ = =


рдЦреИрд░, рдЬрд╛рдБрдЪ рд╕рдлрд▓ рд░рд╣реАред рдЕрдм рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ mv = v рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдЬрд╣рд╛рдБ v рдХреБрдЫ рдорд╛рди рд╣реИ:

( ( рдмрд╕ v ) >> = f ) >> = рдЬреА - рдмрд╛рдИрдВ рдУрд░
= f v >> = g - рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рджреНрд╡рд╛рд░рд╛ = =

( рдмрд╕ v ) >> = ( \ x -> ( f x >> = g ) ) - рджрд╛рдИрдВ рдУрд░
= ( \ x -> ( f x >> = g ) ) v - рдкрд░рд┐рднрд╛рд╖рд╛ рд╕реЗ = =
= f v >> = g - рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧ (рдмреАрдЯрд╛ рдХрдореА)


рдФрд░ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рднреАред рддреЛ рдХрд╛рдиреВрди рдХрд╛ рдХреНрд░рд┐рдпрд╛рдиреНрд╡рдпрди рд╣реЛ рд░рд╣рд╛ рд╣реИ! рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдиреНрдпрд╛рд╕реА рдХреА рд╕рд╣реА рдкрд░рд┐рднрд╛рд╖рд╛ рд╣реИ! рдФрд░ рджрд░реНрд╢рдХ рдкрд╛рдЧрд▓ рд╣реЛ рд░рд╣реЗ рд╣реИрдВ!

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

рдЪ :: рдЗрдВрдЯ -> рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЗрдВрдЯ
f x = рдпрджрд┐ x ` mod` 2 == 0 рддреЛ рдХреБрдЫ рдФрд░ рдирд╣реАрдВ рдмрд╕ ( 2 * x )

g :: рдЗрдВрдЯ -> рд╢рд╛рдпрдж рдЗрдВрдЯ
g x = рдпрджрд┐ x ` mod` 3 == 0 рддреЛ рдХреБрдЫ рдирд╣реАрдВ рдмрд╕ ( 3 * x )

рдПрдЪ :: рдЗрдВрдЯ -> рд╢рд╛рдпрдж рдЗрдВрдЯ
h x = рдпрджрд┐ x ` mod` 5 == 0 рддреЛ рдХреБрдЫ рдФрд░ рдирд╣реАрдВ рдмрд╕ ( 5 * x )


рд╣рдо рдЙрдиреНрд╣реЗрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ, рдЬреЛ рдХреНрд░рдо f , g , h рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИ:

k :: Int -> рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЗрдВрдЯ


рдФрд░ рдпрджрд┐ рддреАрди рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ, рддреЛ рдлрд╝рдВрдХреНрд╢рди k рдХреЛ рдХреБрдЫ рднреА рдирд╣реАрдВ рд▓реМрдЯрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдЗрдирдкреБрдЯ рд╕рдВрдЦреНрдпрд╛ рдХреЛ 30 рд╕реЗ рдЧреБрдгрд╛ рдХрд░рддрд╛ рд╣реИ рдпрджрд┐ рдпрд╣ рдкреВрд░реНрдгрд╛рдВрдХ 2, 3 рдпрд╛ 5 рд╕реЗ рд╡рд┐рднрд╛рдЬреНрдп рдирд╣реАрдВ рд╣реИ (рдФрд░ рдпрджрд┐ рдпрд╣ рд╡рд┐рднрд╛рдЬреНрдп рд╣реИ, рддреЛ рдлрд╝рдВрдХреНрд╢рди рдХреБрдЫ рднреА рдирд╣реАрдВ рд▓реМрдЯрд╛рддрд╛ рд╣реИ)ред

рдкрд┐рдЫрд▓реА рд╕рд╛рдордЧреНрд░реА рд╕реЗ, рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕рдордЭрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЖрдк рдПрдХ рдореБрджреНрд░реАрдХреГрдд рд░рдЪрдирд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╢реНрдореАрд░ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

k = f > => g > => рдЬ


рдпрд╛ рдЖрдк >> = рдСрдкрд░реЗрдЯрд░ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ:

k x = f x >> = g >> = h


рдпрд╛ рд╢рд╛рдпрдж рдЖрдкрдХреЛ рдХреНрдпрд╛ рдкрд╕рдВрдж рд╣реИ - рд╕рд╛рд░:

k x = do y <- f x
z <- g y
рдЬ z рдж


рдпрд╣ рд╕рд░рд▓ рд╣реИ, рдЬреЛ рдХреЛрдИ рднреА рдХрд╣ рд╕рдХрддрд╛ рд╣реИред {1: рдореВрд▓ рдореЗрдВ, рдирд┐рд░рдВрддрд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ "рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдЖрдк рдЗрд╕реЗ рдЯреБрдХрдбрд╝рд╛ рдХрд░рддреЗ рд╣реИрдВ", рдЕрд░реНрде рдореЗрдВ рд╕рдорд╛рдиред - рдиреЛрдЯ рдЯреНрд░рд╛рдВрд╕ред}

рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдлрдВрдХреНрд╢рди h рдХреЛ рдмрд┐рдирд╛ рдореЛрдирд╛рдб рдХрдВрд╕реНрдЯреНрд░рдХреНрд╢рди рдХреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ; рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:

k x = рдХреЗрд╕ f x
рдХреБрдЫ рдирд╣реАрдВ -> рдХреБрдЫ рдирд╣реАрдВ
рдмрд╕ y -> рдХреЗрд╕ g y
рдХреБрдЫ рдирд╣реАрдВ -> рдХреБрдЫ рдирд╣реАрдВ
рдмрд╕ z -> h z


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

f11 = f1 > => f2 > => f3 > => f4 > => f5 > => f6 > => f7 > => f8 > => f9 > => f10


рдпрд╛ ( >> рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ = ):

f11 x = f1 x >> = f2 >> = f3 >> = f4 >> = f5 >> = f6 >> = f7 >> = f8 >> = f9 >> = f10


рдордареЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд░рд╛рдХреНрд╖рд╕реА рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╕рдВрд░рдЪрдирд╛ рд╕рд╛рдзрд╛рд░рдг (рдЧреИрд░-рд░рд╛рдХреНрд╖рд╕реА) рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рдорд╛рди рд╕рд░рд▓ рд╣реИред

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

рдЕрдм рдЪрд▓рддреЗ рд╣реИрдВ рдЕрдЧрд▓реЗ рд╕рдВрдиреНрдпрд╛рд╕реА рдХреА рдУрд░ред

рдореЛрдирд╛рдж рд╕реВрдЪреА (рд╕реВрдЪреА)



рдЕрдЧрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рд╕рд┐рд░реНрдл рдореЛрдирд╛рдж рд╣реА рдкрд╕рдВрдж рдЖрдП, рддреЛ рдЖрдкрдХреЛ рд▓рд┐рд╕реНрдЯ рдореЛрдирд╛рдж рднреА рдкрд╕рдВрдж рдЖрдПрдЧреАред ;-) рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рднрд░реЗрдВрдЧреЗ:

рдЙрджрд╛рд╣рд░рдг рдореЛрдирд╛рдж [ ] рдЬрд╣рд╛рдВ
( >> = ) = {- рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП >> = рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ -}
рд╡рд╛рдкрд╕реА = {- рд╕реВрдЪрд┐рдпреЛрдВ рдХреА рд╡рд╛рдкрд╕реА рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ -}


рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдПрдХ рдЦрд╛рд▓реА рд╕реВрдЪреА [] рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП , рд╣рдо рдПрдХ рд╕реВрдЪреА рдкреНрд░рдХрд╛рд░ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдПрдХ рдЫреЛрдЯреА рд╣реИрдХ рд╣реИ (рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╕рдорд░реНрдерди рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред рд▓реЗрдХрд┐рди рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИред

рд╕рднреА рд╕рдВрдиреНрдпрд╛рд╕рд┐рдпреЛрдВ рдХреА рддрд░рд╣, рдкрд╣рд▓рд╛ рдХрд╛рдо рдпрд╣ рд╕рдордЭрдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЗрд╕ рд╕рдиреНрдпрд╛рд╕реА рдХреЗ рдХрд╛рдо рдХреНрдпрд╛ рд╣реИрдВред рдПрдХ рд╕реВрдЪреА рдХреЗ рд▓рд┐рдП, monadic function f рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

f :: a -> [ b ]


(рдЬрд╣рд╛рдВ [рдмреА] рдХрд╛ рдЕрд░реНрде рд╣реИ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, "рдкреНрд░рдХрд╛рд░ рдмреА рдХреЗ рддрддреНрд╡реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА")ред рд╕реНрдорд░рдг рдХрд░реЛ рдХрд┐ рдПрдХ рд░рд╛рдХреНрд╖рд╕реА рдХрд╛рд░реНрдп рдХреА рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдкрд░рд┐рднрд╛рд╖рд╛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд▓рд┐рдЦреА рдЧрдИ рд╣реИ:

рдПрдл :: рдП -> рдПрдо рдмреА


рдХреБрдЫ рдореЛрдирд╛рдб рдореА рдХреЗ рд▓рд┐рдП , рдЬреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдПрдХ рд╕реВрдЪреА рдПрдХ рдореЛрдирд╛рдб рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдкрд╖реНрдЯ рдЙрдореНрдореАрджрд╡рд╛рд░ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ "рдХреА рд╕реВрдЪреА" рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдирд┐рд░реНрдорд╛рддрд╛ рд╣реИ (рднрд▓реЗ рд╣реА рдЗрд╕рдХрд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рд╣рд╛рд░реНрдб-рд╡рд╛рдпрд░реНрдб рд╣реИ); рд╡реИрдХрд▓реНрдкрд┐рдХ рд░реВрдк рд╕реЗ, рд╣рдо рд╕реВрдЪреА рдХреЛ рд╕реНрд╡рдпрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

data List a = Nil | рд╡рд┐рдкрдХреНрд╖ ( рдПрдХ рд╕реВрдЪреА )


рдЗрд╕рдХреЗ рд▓рд┐рдП рд╡рд┐рдореБрджреНрд░реАрдХрд░рдг рдХреЗ рдкреНрд░рдХрд╛рд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рджрд┐рдЦреЗрдВрдЧреЗ:

f :: a -> рд╕реВрдЪреА b


рд▓реЗрдХрд┐рди рд╣рдо рдЕрднреА рднреА рдорд╛рдирдХ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВрдЧреЗред

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

рдПрдл :: рдЗрдВрдЯ -> [ рдЗрдВрдЯ ]
g :: рдЗрдВрдЯ -> [ рдЗрдВрдЯ ]


рдпрд╣рд╛рдБ, f рдФрд░ g рджреЛрдиреЛрдВ рд╕рдорд╛рди Int рдорд╛рди рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдХрдИ Int рдорд╛рди рд▓реМрдЯрд╛рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рд╣рдо рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдкрд░рд┐рдгрд╛рдо рдХреЛ рд▓реЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдПрдХрддреНрд░рд┐рдд рдХрд░рддреЗ рд╣реБрдП рдлрд╝рдВрдХреНрд╢рди рдЬреА рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдкрд░рд┐рдгрд╛рдо рдкрд░ рд▓рд╛рдЧреВ рдХрд░реЗрдВ? рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдпрд╣ рд╕реАрдзреЗ рдХрд╛рд░реНрдп рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХреЛ рдлрд╝рдВрдХреНрд╢рди рдЬреА рдФрд░ рдПрдл рдХреА рдкрд░рд┐рдгрд╛рдо рд╕реВрдЪрд┐рдпреЛрдВ рд╕реЗ рдЕрдирдкреИрдХ рдХрд┐рдП рдмрд┐рдирд╛ред рдФрд░ рдпрд╣ рд╕реВрдЪреА рдореЗрдВ рдореЛрдирдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЖрдЗрдП рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдЕрдзрд┐рдХ рдореВрд░реНрдд рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреА рдУрд░ рдмрдврд╝реЗрдВ:

рдПрдл :: рдЗрдВрдЯ -> [ рдЗрдВрдЯ ]
f x = [ x - 1 , x , x + 1 ]

g :: рдЗрдВрдЯ -> [ рдЗрдВрдЯ ]
g x = [ - x , x ]


рд╣рдо рдЗрди рджреЛ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХреИрд╕реЗ "рд░рдЪрдирд╛" рдХрд░рддреЗ рд╣реИрдВ? рдПрдлрдПрдХреНрд╕ рдПрдХ рд╕реВрдЪреА рджреЗрддрд╛ рд╣реИ, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рдЬреА рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдорд╛рдирдЪрд┐рддреНрд░ рдлрд╝рдВрдХреНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

f 10 -> [ 9 , 10 , 11 ]
рдирдХреНрд╢рд╛ g ( f 10 ) -> [ [ - реп , реп ] , [ - резреж , резреж ] , [ - резрез , резрез ]


рдпрд╣ рдирдпрд╛ рдкрд░рд┐рдгрд╛рдо рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ f рдФрд░ g рдХреА рд╕рдВрд░рдЪрдирд╛ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░ ( Int рд╕реВрдЪрд┐рдпреЛрдВ рдХреА рд╕реВрдЪреА рд╣реИ, рди рдХрд┐ рдХреЗрд╡рд▓ рдПрдХ Int рд╕реВрдЪреА)ред рд╣рдо рдЗрд╕реЗ рдПрдХ рд╕рд░рд▓ рд╕реВрдЪреА рдореЗрдВ рдХреЙрдирдХреИрдЯ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рд╕реБрдЪрд╛рд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЬреЛ рдмрд╕ рд╕реВрдЪрд┐рдпреЛрдВ рдХреЛ рдПрдХ рдореЗрдВ рд╕рдорд╛рд╣рд┐рдд рдХрд░рддрд╛ рд╣реИ):

- рдХреЙрдирд╕реИрдЯ рдкреНрд░рдХрд╛рд░ рдкрд░ рд╡рд┐рд╢реЗрд╖ рдзреНрдпрд╛рди рджреЗрдВ: [[a]] -> [a]
рдХреЙрдирдХрдЯ ( рдорд╛рдирдЪрд┐рддреНрд░ рдЬреА ( рдПрдл 10 ) ) -> [ - 9 , 9 , - 10 , 10 , - 11 , 11 ]


рд╣рдореЗрдВ рдПрдХ рдкреВрд░реНрдгрд╛рдВрдХ рдореЗрдВ рдПрдл рд▓рд╛рдЧреВ рдХрд░рдХреЗ рдФрд░ рдлрд┐рд░ рдЬреА рдХреЗ рдмрд╛рдж рдХреНрдпрд╛ рд╣реБрдЖ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрд╡реЗрджрди рдХрд░рдиреЗ рд╕реЗ рдЙрддреНрдкрдиреНрди рд╕рднреА рдкрд░рд┐рдгрд╛рдореЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рдорд┐рд▓рд╛ред рдпрджрд┐ рдЖрдк f рдФрд░ g рдХреЛ рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЛрдЪрддреЗ рд╣реИрдВ рдЬреЛ рдпрд╣рд╛рдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдФрд░ рдЕрдм рдкрд░рд┐рдгрд╛рдо рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЙрдирдХрд╛ рдЖрдЙрдЯрдкреБрдЯ рдорд╛рди рдкрд╣рд▓реЗ f рдФрд░ рдлрд┐рд░ g рдХреЗ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдЙрдкрдпреЛрдЧреЛрдВ рдХрд╛ рд╕реЗрдЯ рд╣реЛрдЧрд╛ред рд╣рдо рдЗрд╕реЗ рдПрдХ рдЪрд┐рддреНрд░ рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

                   рдЬреА |  -9
            |  реп ----> |
            |  |  9
            |
        рдЪ |  рдЬреА |  -10
   10 ----> |  10 ----> |
            |  |  10
            |
            |  рдЬреА |  -11
            |  резрез ----> |
                       |  11 


рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджреЗрдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ f рдФрд░ g рдХреА рд╕рдВрд░рдЪрдирд╛ f рдФрд░ g рдХреЗ рдмреАрдЪ рдХреЗ рд╕рднреА рдкрдереЛрдВ рдХрд╛ рд╕рдореБрдЪреНрдЪрдп рд╣реИред

рдЙрддреНрд╕реБрдХрддрд╛ рд╕реЗ, рд╣рдордиреЗ рд╕реВрдЪреА рд╕рдВрдЪрд╛рд▓рдХ рдХреЗ рд▓рд┐рдП рд╕рдВрдЪрд╛рд▓рдХ >> = рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛! рдпрд╣ рдЗрд╕ рддрд░рд╣ рд╕реЗрдЯ рд╣реИ:

- рдПрдорд╡реА :: [рдП]
- g :: a -> [b]
mv >> = g = concat ( рдорд╛рдирдЪрд┐рддреНрд░ g mv )


рдЬрд╣рд╛рдБ mv рд╕реВрдЪреА рдорд╛рди рдореЗрдВ monadic рдорд╛рди рд╣реИ (рдЬреЛ рдХреЗрд╡рд▓ рдкреНрд░рдХрд╛рд░ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИ )ред рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, mv f 10 рдХреА рдЧрдгрдирд╛ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИред рдЦрд╛рд▓реА рд╕реВрдЪреА [] рдХреЗ рд▓рд┐рдП рднреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХрд╛рдо рдХрд░рддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЦрд╛рд▓реА рд╕реВрдЪреА рдореЗрдВ рдореИрдк рдХрд░рдиреЗ рд╕реЗ рдЦрд╛рд▓реА рд╕реВрдЪреА рдорд┐рд▓ рдЬрд╛рдПрдЧреА, рдФрд░ рдЦрд╛рд▓реА рд╕реВрдЪреА рдХреЗ рд▓рд┐рдП рдХреЙрдиреИрдЯ рднреА рд╣рдореЗрд╢рд╛ рдПрдХ рдЦрд╛рд▓реА рд╕реВрдЪреА рд╣реЛрддреА рд╣реИред рдкрд░рд┐рдгрд╛рдо рдСрдкрд░реЗрдЯрд░ рдХреА рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдкрд░рд┐рднрд╛рд╖рд╛ рд╣реИ = = ред

[GHC рдкреНрд░рд╢рдВрд╕рдХреЛрдВ рдХреЗ рд▓рд┐рдП рдзреНрдпрд╛рди рджреЗрдВ: рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ GHC рд╕рдВрдХрд▓рдХ рдореЗрдВ >> = рдСрдкрд░реЗрдЯрд░ рдХреЛ рдЕрдзрд┐рдХ рдХреБрд╢рд▓рддрд╛ рд╕реЗ рдФрд░ рдПрдХ рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдРрд╕рд╛ рд╣реА рдХрд░рддрд╛ рд╣реИред]

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

рд╡рд╛рдкрд╕реА :: a -> [ b ]
рд╡рд╛рдкрд╕реА x = [ x ]


рдпрд╣реА рд╣реИ, рд╡рд╛рдкрд╕реА рдПрдХ рддрддреНрд╡ рд╕реЗ рдПрдХ рд╕реВрдЪреА рдмрдирд╛рддрд╛ рд╣реИред рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдореЛрдирд╛рдж рдХрд╛рдиреВрдиреЛрдВ рдХрд╛ рд╕рдореНрдорд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

- f :: a -> [b]
- x :: a
return x >> = f = concat ( рдореИрдк f ( рд░рд┐рдЯрд░реНрди x ) ) - рдкрд░рд┐рднрд╛рд╖рд╛ рд╕реЗ = =
= рд╕рдорд╛рдкрдХ ( рдорд╛рдирдЪрд┐рддреНрд░ f [ x ] ) - рдкрд░рд┐рднрд╛рд╖рд╛ рд╡рд╛рдкрд╕реА рджреНрд╡рд╛рд░рд╛
= рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд░реВрдк [ рдПрдл x ] - рдкрд░рд┐рднрд╛рд╖рд╛ рдорд╛рдирдЪрд┐рддреНрд░ рджреНрд╡рд╛рд░рд╛
= рдПрдл рдПрдХреНрд╕ - рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд╕рдорддрд▓
- рдкрд╣рд▓реЗ рдореЛрдирд╛рдб рдХрд╛рдиреВрди рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди

- рдПрдорд╡реА :: [рдП]
mv >> = return = concat ( рдореИрдк рд░рд┐рдЯрд░реНрди mv ) - рдкрд░рд┐рднрд╛рд╖рд╛ рд╕реЗ = =
= рд╕рдорд╡рд░реНрддреА ( рдорд╛рдирдЪрд┐рддреНрд░ ( \ x -> [ x ] ) mv ) - рдкрд░рд┐рднрд╛рд╖рд╛ рд╡рд╛рдкрд╕реА рджреНрд╡рд╛рд░рд╛
- рджреЛ рдорд╛рдорд▓реЗ:
- рдХреЗрд╕ 1: mv == []
= рд╕рдВрдХреНрд╖рд┐рдкреНрдд ( рдорд╛рдирдЪрд┐рддреНрд░ ( \ x -> [ x ] ) [ ] ) - рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдПрдо.рд╡реА.
= рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд░реВрдк [ ] - рдкрд░рд┐рднрд╛рд╖рд╛ рдорд╛рдирдЪрд┐рддреНрд░ рджреНрд╡рд╛рд░рд╛
= [ ] - рдкрд░рд┐рднрд╛рд╖рд╛ рд╕рдорд╛рд╕ рджреНрд╡рд╛рд░рд╛
= mv - рдкрд░рд┐рднрд╛рд╖рд╛ mv рджреНрд╡рд╛рд░рд╛
- рдХреЗрд╕ 2: mv == [v1, v2, ...]
= рд╕рдВрдХреНрд╖рд┐рдкреНрдд ( рдорд╛рдирдЪрд┐рддреНрд░ ( \ x -> [ x ] ) [ v1 , v2 , ... ] ) - рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдПрдо.рд╡реА.
= рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд░реВрдк [ [ v1 ] , [ v2 ] , ... ] - рдкрд░рд┐рднрд╛рд╖рд╛ рдорд╛рдирдЪрд┐рддреНрд░ рджреНрд╡рд╛рд░рд╛
= [ v1 , v2 , ... ] - рдкрд░рд┐рднрд╛рд╖рд╛ рд╕рдорд╛рд╕ рджреНрд╡рд╛рд░рд╛
= mv - рдкрд░рд┐рднрд╛рд╖рд╛ mv рджреНрд╡рд╛рд░рд╛
- рджреВрд╕рд░реЗ рдореЛрдирд╛рдб рдХрд╛рдиреВрди рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


рд╡реИрд╕реЗ, рд╕рдиреНрдпрд╛рд╕реА рдХреЗ рд▓рд┐рдП рджреЛ рдХрд╛рдиреВрди рд╕рд┐рджреНрдз рд╣реЛрддреЗ рд╣реИрдВред рдЖрдк рд╡рд╛рдкрд╕реА рдХреА рдЕрдиреНрдп рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЬрдм рд░рд┐рдЯрд░реНрди рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реВрдЪреА [0, 2, 3] , рдпрд╛ рдЬрдм рдпрд╣ рдЕрдкрдиреЗ рддрд░реНрдХ рдХреА рдЕрдирдВрдд рд╕рдВрдЦреНрдпрд╛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ), рдФрд░ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рд╡реЗ рд╕рднреА рд╡рд┐рд╡рд╛рджрд╛рд╕реНрдкрдж рдХрд╛рдиреВрдиреЛрдВ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рд░рд╛рдХреНрд╖рд╕реА рдХрд╛рдиреВрдиреЛрдВ рдХрд╛ рдЕрднреНрдпрд╛рд╕ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реИред

рд╕реВрдЪреА рдХреЛ рдЕрд╕рд▓реА рдореЛрдирд╛рдб рдХрд╣рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдпрд╣ рддреАрд╕рд░рд╛ рдореМрджреНрд░рд┐рдХ рдХрд╛рдиреВрди рд╕рд╛рдмрд┐рдд рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдХрд╣рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╣ рдЕрдзрд┐рдХ рдХрдард┐рди рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рд╡реИрд╕реЗ рднреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗред рдЕрдкрдиреЗ рдХрд╛рд░реНрдп рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рддреАрд╕рд░реЗ рдореЛрдирдбрд┐рдХ рдХрд╛рдиреВрди рдХреЗ "рд╕реБрдЦрдж" рд░реВрдк рдХреЛ рд▓реЗрддреЗ рд╣реИрдВ (рдЬрд┐рд╕реЗ рдореЛрдиреЛрдбрд┐рдХ рд░рдЪрдирд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред рдкрд╣рд▓реЗ рд╣рдореЗрдВ рд╕реВрдЪрд┐рдпреЛрдВ рдХреА рдПрдХрд╛рджрд╢реА рд░рдЪрдирд╛ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдЪрд╛рд╣рд┐рдП:

- рддреАрд╕рд░рд╛ рдореЛрдирдбрд┐рдХ рдХрд╛рдиреВрди (рд╕реБрдЦрдж рд╕рдВрд╕реНрдХрд░рдг):
( f > => g ) > => h = f > => ( g > = = h )
- рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░:
f > => g = \ x -> f x >> = g
- рд╕реВрдЪреА рдХреЗ рд▓рд┐рдП рдкрд░рд┐рднрд╛рд╖рд╛ >> = = рд▓реЗрдВ:
f > => g = \ x -> рд╕рдорддрд▓ ( рдорд╛рдирдЪрд┐рддреНрд░ g ( f x ) )
- рдЖрдк рд░рдЪрдирд╛ рдСрдкрд░реЗрдЯрд░ (ред) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
f > => g = рд╕рдорддрд▓ ред рдирдХреНрд╢рд╛ рдЬреА ред рдЪ


рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рдХреЙрдирдХреИрдЯ рдФрд░ рдорд╛рдирдЪрд┐рддреНрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдХрдИ рдЧреБрдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ред рдЖрдкрдХреЛ рдЙрдиреНрд╣реЗрдВ рдЕрднреА рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реНрд╡рд╛рд╕ рдкрд░ рд▓реЗрдирд╛ рд╣реЛрдЧрд╛; рддреЛ рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдХреИрд╕реЗ рджрд┐рдЦрд╛рдКрдВрдЧрд╛:

- рд╕рдореАрдХрд░рдг 1:
map ( f ред g ) = map f ред рдирдХреНрд╢рд╛ рдЬреА
- рд╕рдореАрдХрд░рдг 2:
рдирдХреНрд╢рд╛ рдЪ ред concat = рдХреЙрдирдХрдЯ ред рдирдХреНрд╢рд╛ ( рдирдХреНрд╢рд╛ f )
- рд╕рдореАрдХрд░рдг 3:
рд╕рдорддрд▓ ред concat = рдХреЙрдирдХрдЯ ред рдорд╛рдирдЪрд┐рддреНрд░


рдореИрдВрдиреЗ рдПрдХ рдмрд╛рд░ рдХрд╣рд╛ рдерд╛ рдХрд┐ рдбреЙрдЯ (?) рдПрдХ (рд╢реБрджреНрдз) рдХрдВрдкреЛрдЬрд┐рд╢рди рдСрдкрд░реЗрдЯрд░ рд╣реИред рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЗрд╕рдХреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХрдо рд╣реИ, рдЗрд╕рд▓рд┐рдП, рдореИрдк рдПрдл рдЬреИрд╕реЗ рднрд╛рд╡ ред рдореИрдк рдЬреА рдХрд╛ рдорддрд▓рдм рдХреЗрд╡рд▓ (рдореИрдк рдПрдл) рд╣реИред (рдирдХреНрд╢рд╛ рдЫ) ред рд╣рд╛рд╕реНрдХреЗрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдЖрдорддреМрд░ рдкрд░ рдЬрд╣рд╛рдВ рд╕рдВрднрд╡ рд╣реЛ, рдХреЛрд╖реНрдардХ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рддреЗ рд╣реИрдВред рдпрд╣ рд╕рдордЭрдирд╛ рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдк рдПрдл рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдирдХреНрд╢рд╛ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рджреЛ рддрд░реНрдХ рд╣реЛрддреЗ рд╣реИрдВ (рдЬреИрд╕реЗ рд╕реВрдЪреА рдЖрдЗрдЯрдо рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдФрд░ рд╕реВрдЪреА рд╕реНрд╡рдпрдВ)ред рдпрджрд┐ рдЖрдкрдХреЛ рдпрд╛рдж рд╣реИ рдХрд┐ рдореИрдВ рдХрд┐рд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рдерд╛, рддреЛ рдЖрдк рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдорд╛рдирдЪрд┐рддреНрд░ f рдПрдХ рдРрд╕рд╛ рдХрд╛рд░реНрдп рд╣реИ рдЬреЛ рдПрдХ рд╕реВрдЪреА рд▓реЗрддрд╛ рд╣реИ рдФрд░ рджреВрд╕рд░рд╛ рд▓реМрдЯрддрд╛ рд╣реИ, рдЬрд╣рд╛рдБ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдкрд░ f рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред рд╣рдо рдЕрдм рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред

рддреЛ, рд╕рдмреВрдд рдХреЗ рдирд┐рд╖реНрдХрд░реНрд╖, рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рд╕рднреА рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП:

( f > => g ) > => рдПрдЪ
= ( рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдирд╛рдо ред рдорд╛рдирдЪрд┐рддреНрд░ рдЬреА ред рдПрдл ) > => рдПрдЪ - рдкрд░рд┐рднрд╛рд╖рд╛ рджреНрд╡рд╛рд░рд╛ = =>
= рд╕рдорд╛рд╕ ред рдирдХреНрд╢рд╛ h ред ( рдХреЙрдиреНрдХреИрдЯ ред рдореИрдк рдЬреА ред рдПрдл ) - рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рджреНрд╡рд╛рд░рд╛ = =>
= рд╕рдорд╛рд╕ ред рдирдХреНрд╢рд╛ h ред рд╕рдорддрд▓ ред рдирдХреНрд╢рд╛ рдЬреА ред f - рдЕрдирд╛рд╡рд╢реНрдпрдХ рдХреЛрд╖реНрдардХ рд╣рдЯрд╛рдПрдВ

f > => ( g > => h )
= f > => ( рдХреЙрдиреНрдХреИрдЯ ред рдореИрдк h ред g ) - рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рджреНрд╡рд╛рд░рд╛ = =>
= рд╕рдорд╛рд╕ ред рдорд╛рдирдЪрд┐рддреНрд░ ( concat ред рдорд╛рдирдЪрд┐рддреНрд░ h ред g ) f - рдкрд░рд┐рднрд╛рд╖рд╛ рд╕реЗ = =>
= рд╕рдорд╛рд╕ ред map ( ( concat ред map h ) ред g ) f рдмрд░рд╛рдмрд░ рдкрд░рд┐рд╡рд░реНрддрди рд╣реИ
= рд╕рдорд╛рд╕ ред ( рдирдХреНрд╢рд╛ ( рдХреЛрдиреИрдЯ рдореИрдк h ) ) ред ( рдирдХреНрд╢рд╛ рдЫ ) ред f - рд╕рдореАрдХрд░рдг 1 рдХреЗ рдЕрдиреБрд╕рд╛рд░
= рд╕рдорд╛рд╕ ред рдирдХреНрд╢рд╛ ( concat ред рдирдХреНрд╢рд╛ h ) ред рдирдХреНрд╢рд╛ рдЬреА ред f - рдЕрдирд╛рд╡рд╢реНрдпрдХ рдХреЛрд╖реНрдардХ рд╣рдЯрд╛рдПрдВ
= рд╕рдорд╛рд╕ ред рдорд╛рдирдЪрд┐рддреНрд░ рдирдХреНрд╢рд╛ ( рдирдХреНрд╢рд╛ h ) ред рдирдХреНрд╢рд╛ рдЬреА ред f - рд╕рдореАрдХрд░рдг 1 рдХреЗ рдЕрдиреБрд╕рд╛рд░


рдЕрдм рд╣рдореЗрдВ рдпрд╣ рджрд┐рдЦрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

рд╕рдорддрд▓ ред рдирдХреНрд╢рд╛ h ред concat = рдХреЙрдирдХрдЯ ред рдорд╛рдирдЪрд┐рддреНрд░ рдирдХреНрд╢рд╛ ( рдирдХреНрд╢рд╛ h )


рдЖрдЗрдП рдЗрд╕реЗ рд╕рд╛рдмрд┐рдд рдХрд░рддреЗ рд╣реИрдВред

- рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП рдХреЛрд╖реНрдардХ рдЬреЛрдбрд╝реЗрдВ:
рд╕рдорддрд▓ ред ( рдореИрдк h ред рдХреЙрдирдХрдЯ ) = concat ред рдорд╛рдирдЪрд┐рддреНрд░ рдирдХреНрд╢рд╛ ( рдирдХреНрд╢рд╛ h )
- рд╕рдореАрдХрд░рдг 2 рдХреЗ рдЕрдиреБрд╕рд╛рд░:
рд╕рдорддрд▓ ред рд╕рдорддрд▓ ред map ( рдирдХреНрд╢рд╛ h ) = рд╕рдорддрд▓ ред рдорд╛рдирдЪрд┐рддреНрд░ рдирдХреНрд╢рд╛ ( рдирдХреНрд╢рд╛ h )
- рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП рдХреЛрд╖реНрдардХ рдЬреЛрдбрд╝реЗрдВ:
( concat ред рдХреЙрдирдХрдЯ ) ред map ( рдирдХреНрд╢рд╛ h ) = рд╕рдорддрд▓ ред рдорд╛рдирдЪрд┐рддреНрд░ рдирдХреНрд╢рд╛ ( рдирдХреНрд╢рд╛ h )
- рд╕рдореАрдХрд░рдг 3 рдХреЗ рдЕрдиреБрд╕рд╛рд░:
рд╕рдорддрд▓ ред рдорд╛рдирдЪрд┐рддреНрд░ map ( рдирдХреНрд╢рд╛ h ) = рд╕рдорддрд▓ ред рдорд╛рдирдЪрд┐рддреНрд░ рдирдХреНрд╢рд╛ ( рдирдХреНрд╢рд╛ h )


рдФрд░ рдпрд╣ рдЕрдВрдд рд╣реИред Fuuuh! рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рд╛рд╕реНрдХреЗрд▓рд┐рд╕реНрдЯ рд╢рд╛рдпрдж рд╣реА рдХрднреА рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕рдмреВрдд рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдХрдерд┐рдд рдореЛрдирд╛рдб рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╕рдиреНрдпрд╛рд╕реА рд╣реИред

рд╕реАрдорд╛рдВрдд рдиреЛрдЯ: рдорд╛рдирдЪрд┐рддреНрд░ / рд╕рдорд╛рдкрдХ (рд╕рдореАрдХрд░рдг 1, 2 рдФрд░ 3) рдХреЗ рд╕рд╛рде рдкрд╣рдЪрд╛рди рдХреА рд╡реНрдпреБрддреНрдкрддреНрддрд┐

рдЯреНрд░реЗрдирд┐рдВрдЧ

рдкрд╣рдЪрд╛рди рдХреЗ рдкреНрд░рдорд╛рдг рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдмрдврд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдкрд╣рд▓реЗ рдХрдИ рдЕрдиреНрдп (рдЧрдгрд┐рдд рдХрдард┐рди рд╣реИ!) рдХреЛ рд╕рд╛рдмрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рдо рдЙрдиреНрд╣реЗрдВ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рддреЗ рд╣реИрдВ:

- рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ 4:
concat ( x: xs ) = x ++ concat xs
- рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ 5:
concat ( x ++ y ) = concat x ++ concat y
- рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ 6:
map f ( x ++ y ) = map f x ++ рдореИрдк f y


рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ 4 рдЕрд╡рддрд▓ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рд╕реЗ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИред рдПрдХреНрд╕рдкреЗрд░реАрдореЗрдВрдЯ 4 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХреНрд╕ рдкрд░ рдЗрдВрдбрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдПрдХреНрд╕рдкреНрд░реЗрд╢рди 5 рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рд╛рдмрд┐рдд рд╣реЛрддрд╛ рд╣реИред

- рдЖрдзрд╛рд░ рдорд╛рдорд▓рд╛: x - рдЦрд╛рд▓реА рд╕реВрдЪреА
concat ( [ ] ++ y ) = concat [ ] ++ concat y
concat y = [ ] ++ concat y - рдкрд░рд┐рднрд╛рд╖рд╛ concat []
concat y = concat y -- ++
-- .

-- : x ; x1 - ; xs - .
concat ( ( x1:xs ) ++ y )
= concat ( x1 : ( xs ++ y ) ) -- ++
= x1 ++ concat ( xs ++ y ) -- 4
= x1 ++ concat xs ++ concat y -- inductive hypothesis

concat ( x1:xs ) ++ concat y
= x1 ++ concat xs ++ concat y -- 4
-- , .


6 :

-- : x -
map f ( [ ] ++ y ) = map f [ ] ++ map f y
map f y = [ ] ++ map f y
map f y = map f y
-- .

-- : x - ; x1 - ; xs - .
map f ( x ++ y )
= map f ( ( x1:xs ) ++ y )
= map f ( x1 : ( xs ++ y ) ) -- ++
= f x1 : map f ( xs ++ y ) -- map
= f x1 : ( map f xs ++ map f y ) -- inductive hypothesis
= ( f x1 : map f xs ) ++ map f y -- ++
= map f ( x1:xs ) ++ map f y -- map
= map f x ++ map f y -- x
-- , .


1, 2 3.

1:

map ( f . g ) = map f . map g


- , map :

-- :
map ( f . g ) [ ] = [ ]
( map f . map g ) [ ] = map f ( map g [ ] ) = map f [ ] = [ ]
-- OK

-- : :
map ( f . g ) ( x:xs )
= ( ( f . g ) x ) : ( map ( f . g ) xs ) -- map
= ( f ( g x ) ) : ( map ( f . g ) xs ) -- (.)
( map f . map g ) ( x:xs )
= map f ( map g ( x:xs ) ) -- (.)
= map f ( ( g x ) : ( map g xs ) ) -- map
= ( f ( g x ) ) : ( map f ( map g xs ) ) -- map
= ( f ( g x ) ) : ( ( map f . map g ) xs ) -- (.)
= ( f ( g x ) ) : ( map ( f . g ) xs ) -- inductive hypothesis
-- , .


2:

map f . concat = concat . map ( map f )


:

-- :
( map f . concat ) [ ] = map f ( concat [ ] ) = map f [ ] = [ ]
( concat . map ( map f ) ) [ ] = concat ( map ( map f ) [ ] ) = concat [ ] = [ ]
-- OK

-- :
( map f . concat ) ( x:xs )
= map f ( concat ( x:xs ) ) -- (.)
= map f ( x ++ concat xs ) -- 4
= map f x ++ ( map f ( concat xs ) ) -- 6
= map f x ++ ( ( map f . concat ) xs ) -- (.)
= map f x ++ ( ( concat . map ( map f ) ) xs ) -- inductive hypothesis
= map f x ++ concat ( map ( map f ) xs ) -- (.)

( concat . map ( map f ) ) ( x:xs )
= concat ( map ( map f ) ( x:xs ) ) -- (.)
= concat ( map f x : map ( map f ) xs ) -- map
= map f x ++ concat ( map ( map f ) xs ) -- 4
-- , .


3:

concat . concat = concat . map concat


, :

-- :
( concat . concat ) [ ] = concat ( concat [ ] ) = concat [ ] = [ ]
( concat . map concat ) [ ] = concat ( map concat [ ] ) = concat [ ] = [ ]
--

-- :
( concat . concat ) ( x:xs )
= concat ( concat ( x:xs ) ) -- (.)
= concat ( x ++ concat xs ) -- 4
= concat x ++ concat ( concat xs ) -- 5

( concat . map concat ) ( x:xs )
= concat ( map concat ( x:xs ) ) -- (.)
= concat ( concat x : map concat xs ) -- map
= concat x ++ concat ( map concat xs ) -- 4
= concat x ++ ( concat . map concat ) xs -- (.)
= concat x ++ ( concat . concat ) xs -- inductive hypothesis
= concatx ++ рдХреЙрдиреНрдХреИрдЯ ( concat xs ) - рдкрд░рд┐рднрд╛рд╖рд╛ (ред) рдХреЗ рдЕрдиреБрд╕рд╛рд░
- рдпрд╣ рд╕рд╣реА рд╣реИ, рдЖрд╡рд╢реНрдпрдХрддрд╛рдиреБрд╕рд╛рд░ред



рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЕрдм рдЖрдкрдХреЛ рдХреЛрдИ рд╕рдВрджреЗрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╕реВрдЪреА рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╕рдиреНрдпрд╛рд╕реА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╕рдиреНрдпрд╛рд╕реА рд╣реИред ;-)

рдФрд░ рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдпрд╣рд╛рдБ рд╕рд╡рд╛рд▓, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдпрд╣ рд╣реИ: рдХреНрдпрд╛ рд╣рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╣ рдХрд░рдиреЗ рдХреЗ рдЗрдХрд╛рдИ-рд╕реВрдЪреА рдХреЗ рд╕рд╛рде, рдХрд┐ рдпрд╣ monads рдХреЗ рдмрд┐рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ? рдпрд╣рд╛рдБ рдЖрдкрдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: 1 рдФрд░ 6 рдХреЗ рдмреАрдЪ рдХреА рд╕рднреА рд╕рдВрдЦреНрдпрд╛рдПрдБ рдЬреНрдЮрд╛рдд рдХрд░реЗрдВ, рдЬрд┐рдирдХрд╛ рдпреЛрдЧ 7 рд╣реИ (рд╕рдВрдЦреНрдпрд╛рдПрдБ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкрд╛рд╕рд╛)ред рд╕реВрдЪреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рд╕рд░рд▓ рд╣реИ:

- рд╣рдо <font color = blue> do </ font> -notation:
do n1 <- [ 1 .. 6 ]
n2 <- [ 1 .. 6 ] рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ
рдпрджрд┐ n1 + n2 == 7 рддреЛ рд╡рд╛рдкрд╕реА ( n1 , n2 ) рдЕрдиреНрдп [ ]
- рдкрд░рд┐рдгрд╛рдо: [(рез,рем), (реи,рел), (рей,рек), (рек,рей), (рел,реи), (рем,рез)]


рдФрд░, рдпрджрд┐ рдЖрдк рдЕрдзрд┐рд▓реЗрдЦрд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдХрд░ -notatsii рдХреЗрд╡рд▓ рд╕реНрдкрд╖реНрдЯ рдорд┐рд▓рддреА рд╣реИ:

[ 1 .. 6 ] >>= \n1 ->
[ 1 .. 6 ] >>= \n2 ->
if n1 + n2 == 7 then return ( n1 , n2 ) else [ ]


рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ?рдЖрдк рдЦреБрдж рдХрд╛ рдЦрд░реНрдЪ рдЖрдПрдЧрд╛ рдмреИрдарддреЗ рд╣реИрдВ рдФрд░ рд╕рднреА рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝реЗ рдЧрдгрдирд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП >> = рдФрд░ рд╡рд╛рдкрд╕реА рд╕реВрдЪреА рдореЗрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдЙрдВрдЧрд▓рд┐рдпреЛрдВ рдкрд░ рдПрдХ рд╡реНрдпрд╛рдЦреНрдпрд╛ рд╣реИред рддреЛ: [рез..рем] рд╕реВрдЪреА рдореЗрдВ рдорда рдореЗрдВ рдорд╛рдирдж рдореВрд▓реНрдп рд╣реИ, рдФрд░ рдПрди рез рдПрдХ рд╕рдордп рдореЗрдВ рдЙрди рд╕рднреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рддрд╛ рд╣реИ ред n2 рдмрд┐рд▓реНрдХреБрд▓ рд╕рдорд╛рди рд╣реИред рдФрд░ рд╕рднреА рдЬреЛрдбрд╝реЗ (n1, n2) рдЬрд┐рдирдХреА рд░рд╛рд╢рд┐ рд╕рд╣реА рд╣реИ рдЙрдиреНрд╣реЗрдВ рд╡рд╛рдкрд╕ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ред рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рд╕рднреА рддрддреНрд╡реЛрдВ рдкрд░ рдлрд╝рдВрдХреНрд╢рди рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рд╡реЗ рдПрдХ рддрддреНрд╡ рдереЗред рдпрд╣ рдореЛрдирд╛рдб рд╕реВрдЪреА рдХрд╛ рд╕рд╛рд░ рд╣реИред

рдпрджрд┐ рдЖрдкрдХреЛ рд╣рд╛рд╕реНрдХреЗрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдореЗрдВ рдмрд╣реБрдд рдЬреНрдЮрд╛рди рд╣реИ, рддреЛ рдЖрдкрдиреЗ рд╢рд╛рдпрдж рдЕрдкрдиреЗ рд╕рд┐рд░ рдореЗрдВ рдПрдХ рдЬрд▓рдкрд░реА рдХреЛ рд╕реБрдирд╛ рд╣реЛред "рдРрд╕рд╛ рдХреИрд╕реЗ!" рдореИрдВ рдЖрдкрдХрд╛ рдЖрдХреНрд░реЛрд╢ рд╕реБрдирддрд╛ рд╣реВрдБред тАЬрдХреНрдпреЛрдВ рдирд╣реАрдВ рдмрд╕ рд╕реВрдЪреА рд╕рдордЭ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ ); тАЭрдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ:

[ ( n1 , n2 ) | n1 <- [ 1 .. 6 ] , n2 <- [ 1 .. 6 ] , n1 + n2 == 7 ]


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

рд╕реВрдЪреА рдЬрдирд░реЗрдЯрд░ рдХреЗ рд▓рд┐рдП рд╕реВрдЪреА рдореЛрдирд╛рдб рд╕рд┐рд░реНрдл рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╕реЗ рдЕрдзрд┐рдХ рд╣реИред рдПрдХ рдУрд░, рдХрдИ рдмрд╣реБрдд рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдп рд╣реИрдВ рдЬреЛ рдХрд┐рд╕реА рднреА рднрд┐рдХреНрд╖реБрдУрдВ рдХреЗ рдЕрд╡рддрд╛рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ; рд╡реЗ рд╕реВрдЪреА рдХреЗ рд╕рд╛рде рднреА рдХрд╛рдо рдХрд░реЗрдВрдЧреЗред рджреВрд╕рд░реА рдУрд░ рдХреЗ рд╡рд░реНрдЧ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╣реИ рдЗрдХрд╛рдИ , рдХрд╣рд╛ рдЬрд╛рддрд╛ MonadPlusред рдпрд╣ рднрд┐рдХреНрд╖реБрдУрдВ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдкреВрд░рдХ рдХрд░рддрд╛ рд╣реИ (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдпрд╣ рднрд┐рдХреНрд╖реБ рдХреЗ рд▓рд┐рдП "рд╢реВрдиреНрдп" рддрддреНрд╡ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ "рдЬреЛрдбрд╝" рджреЛ рд░рд╛рдХреНрд╖рд╕реА рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддрд╛ рд╣реИ)ред рд╕реВрдЪреА рдХреЗ рд░реВрдк рдореЗрдВ рдЕрд╡рддрд╛рд░ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ рдЗрдХрд╛рдИ , рдФрд░ MonadPlus , рдФрд░ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдХреЗ рд╕рдордЧреНрд░ рд╕рдорд╛рд░реЛрд╣ MonadPlus рднреА рд╕реВрдЪрд┐рдпреЛрдВ рдкрд░ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗред (рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдХрд╛рд░реНрдпреЛрдВ concat - рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╣реИ msum рд╣реИ, рдЬреЛ рд╕рднреА рдЕрд╡рддрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ MonadPlus , рд╕реВрдЪреА рднреА рд╢рд╛рдорд┐рд▓ рд╣реИред) рдпрд╣ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдХрд╛рд░реНрдпреЛрдВ рдХрд┐ рдбреЗрдЯрд╛ рдХреЗ рдХрдИ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рд╕реЗ рдордд рдкреВрдЫреЛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИред рдпрд╣ рдПрдХ рд╕реНрдкрд╖реНрдЯ рдЬреАрдд рд╣реИред

рдЕрдЧрд▓реА рдмрд╛рд░


рдЕрдЧрд▓реЗ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рдЙрди рднрд┐рдХреНрд╖реБрдУрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдВрдЧреЗ рдЬреЛ рдЖрдкрдХреЛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред

рд╕рд╛рдордЧреНрд░реА

рднрд╛рдЧ 1: рдореВрд▓ рдмрд╛рддреЗрдВ
рднрд╛рдЧ 2: рдХрд╛рд░реНрдп >> = рдФрд░ рд╡рд╛рдкрд╕реА
рднрд╛рдЧ 3: рдореЛрдирд╛рдж рдХрд╛рдиреВрди
рднрд╛рдЧ 4: рд╢рд╛рдпрдж рдореЛрдирд╛рдб рдФрд░ рд╕реВрдЪреА рдореЛрдирд╛рдб

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


All Articles