рдорд╛рдЗрдХ рд╡рдирд┐рдпрд░ рджреНрд╡рд╛рд░рд╛
рджреЛ рдореМрд▓рд┐рдХ рдореМрджреНрд░рд┐рдХ рд╕рдВрдЪрд╛рд▓рди
рдпрд╛рдж рд░рдЦреЗрдВ, рдореИрдВрдиреЗ рдХрд╣рд╛ рдХрд┐ рднрд┐рдХреНрд╖реБ рд░рдЪрдирд╛ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдХрд░рддреЗ рд╣реИрдВ? рд╣рдо рдпрд╣рд╛рдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред рдзреИрд░реНрдп рд░рдЦреЗрдВ, рд╣рдореЗрдВ рдХреБрдЫ рд╕рдордп рд▓рдЧреЗрдЧрд╛ред
рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░, рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдЕрд╕реНрдкрд╖реНрдЯ рднрд╛рд╡рдирд╛ рдХрд╛ рд╡рд┐рдХрд╛рд╕ рдХрд┐рдпрд╛ рд╣реИ, рд╡реЗ рдХреНрдпрд╛ рд╣реИрдВ рдФрд░ рдЙрдирдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ - рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╕рдВрд░рдЪрдирд╛, рдзрдиреНрдпрд╡рд╛рдж рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╣рдо рдирдП рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╣реИрдВ, рдкреБрд░рд╛рдиреЗ рдХреЛ рдорд┐рд▓рд╛рдХрд░ред рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рд▓рдЧрд╛рддрд╛рд░ "рдХреЙрдореНрдмрд┐рдиреЗрдмрд┐рд▓рд┐рдЯреА" {1} рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдпрджрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдореЗрдВ рдХреБрдЫ рднреА рдЧрдардмрдВрдзрди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рд▓рд╛рдЧрдд рдмрд╣реБрдд рдХрдо рд╣реИред рдЗрд╕реА рддрд░рд╣, рд╣рдорд╛рд░реЗ рдирд╡-рд╡рд┐рдХрд╕рд┐рдд рдореЛрдирдбрд┐рдХ рдХрд╛рд░реНрдп рдЙрддрдиреЗ рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рдереЗ рдпрджрд┐ рд╡реЗ рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рдХрд┐рдП рдЧрдП рдереЗ рдЬреИрд╕реЗ рд╡реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ, рдЙрдирдХреА рд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП рдЖрдк рд╣рд╛рд╕реНрдХреЗрд▓ рднрд╛рд╖рд╛ рдХреЗ рдорд╛рдирдХ рдлрд╝рдВрдХреНрд╢рди "рдмрд┐рдВрджреБ" (ред) рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рд╣рдо рдпрд╣ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣рд╛рдВ рдХреБрдЫ рдФрд░ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдФрд░ рджреЛ рдореМрд▓рд┐рдХ рдореМрджреНрд░рд┐рдХ рд╕рдВрдЪрд╛рд▓рди (рдпрд╛, рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП, рдЙрдирдХреЗ рдкреНрд░рдХрд╛рд░) рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред
рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдРрд╕реЗ рдореМрджреНрд░рд┐рдХ рдХрд╛рд░реНрдп рд╣реИрдВ:
рдПрдл :: рдП -> рдПрдо рдмреА
g :: b -> m c
рдХреБрдЫ рдореЛрдирд╛рдб рдХреЗ рд▓рд┐рдПред рдпрджрд┐ рдЖрдк рдПрдХ рдФрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐
I рдФрд░ monad рдореЗрдВ
f рдФрд░
g рдХрд╛рд░реНрдп рд╣реИрдВ:
f :: a -> IO b
g :: b -> IO c
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдиреНрдп рд╕рд╛рдзреБрдУрдВ рдХреЗ рд▓рд┐рдП рднреА рдпрд╣реА рд╕рдЪ рд╣реИред рд╕реНрдорд░рдг рдХрд░реЛ (
IO рдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП) рдХрд┐ рдлрд╝рдВрдХреНрд╢рди
рдЪ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдорд╛рди рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдкреНрд░рдХрд╛рд░
b рдХрд╛ рдПрдХ рдорд╛рди рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рд╢рд╛рдпрдж, рдЗрдирдкреБрдЯ / рдЖрдЙрдЯрдкреБрдЯ (
IO ) рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рддрд╛ рд╣реИред рдлрд╝рдВрдХреНрд╢рди
рдЬреА , рдмрджрд▓реЗ рдореЗрдВ, рдЯрд╛рдЗрдк
рдмреА рдХрд╛ рдорд╛рди рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЯрд╛рдЗрдк
рд╕реА рдХрд╛ рдорд╛рди рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рд╢рд╛рдпрдж, рдпрд╣ рдЗрдирдкреБрдЯ / рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдлрд╝рдВрдХреНрд╢рди
рдПрдЪ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВ:
h :: a -> IO c
рдпрд╣реА рд╣реИ, рдкрд░рд┐рдгрд╛рдо рдПрдХ рдРрд╕рд╛ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдЯрд╛рдЗрдк
a рдХрд╛ рдорд╛рди рд▓реЗрддрд╛ рд╣реИ, рдкреНрд░рдХрд╛рд░
c рдХрд╛ рдорд╛рди рдЖрдЙрдЯрдкреБрдЯ рдХрд░рддрд╛ рд╣реИ
, рдФрд░ рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЗрдирдкреБрдЯ / рдЖрдЙрдЯрдкреБрдЯ (рдЬрд╣рд╛рдВ рдЗрдирдкреБрдЯ / рдЖрдЙрдЯрдкреБрдЯ рдХреНрдпрд╛
f рдФрд░
g do рдХрд╛ рдПрдХ рд╕рдВрдпреЛрдЬрди
рд╣реИ ) рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЫрджреНрдо рднрд╛рд╖рд╛ рдореЗрдВ, рд╣рдо рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
рдХрдиреЗрдХреНрдЯ рд╕рдорд╛рд░реЛрд╣:
( f :: a -> IO b )
рд╕рдорд╛рд░реЛрд╣ рдХреЗ рд╕рд╛рде:
( g :: b -> IO c )
рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП:
( h :: a -> IO c )
рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ, рд░рдЪрдирд╛ рдСрдкрд░реЗрдЯрд░ (рдбреЙрдЯ) рдХреЛ
IO рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдкрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╣рдорд╛рд░реЗ
f рдФрд░
g рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рддреБрд▓рдирд╛ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдмрд┐рдирд╛ рдХрд┐рд╕реА
IO рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░
p ,
q ,
r рдХреЗ рд╢реБрджреНрдз рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рджреЗрдЦреЗрдВ:
рдкреА :: рдП -> рдмреА
рдХреНрдпреВ :: рдмреА -> рд╕реА
рдЖрд░ :: рдП -> рд╕реА
рдСрдкрд░реЗрдЯрд░ (ред) рдФрд░ (>ред>) рдпрд╣рд╛рдБ рдЙрдкрдпреБрдХреНрдд рд╣реИрдВ:
( ред ) :: ( b -> c ) -> ( a -> b ) -> ( a -> c )
рдЖрд░ = рдХреНрдпреВ ред рдкреА
( >ред> ) :: ( рдП -> рдмреА ) -> ( рдмреА -> рд╕реА ) -> ( рдП -> рд╕реА )
r = p >> рдХреНрдпреВ
рд▓реЗрдХрд┐рди рдЙрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рд░рд╛рдХреНрд╖рд╕реА рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛:
f :: a -> IO b
g :: b -> IO c
h :: a -> IO c
рдЬреА ред f -> рдЯрд╛рдЗрдкрд┐рдВрдЧ рдПрд░рд░ ! IO b рдФрд░ b рдХреЗ рдмреАрдЪ рдмреЗрдореЗрд▓
f >> g -> рдЯрд╛рдЗрдкрд┐рдВрдЧ рддреНрд░реБрдЯрд┐ ! IO b рдФрд░ b рдХреЗ рдмреАрдЪ рдмреЗрдореЗрд▓
рдпрджрд┐ рдЯрд╛рдЗрдк
b рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддреЛ рдЖрдк
IO b рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдХ рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред (рдпрд╣ рд╣рд╛рд╕реНрдХреЗрд▓ рдореЛрдиреИрдбрд┐рдХ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рджреНрд╡рд╛рд░рд╛ рдХреА рдЧрдИ рд╕рдмрд╕реЗ рдЖрдо рдЧрд▓рддреА рд╣реИред) рд╣рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдореЛрдирдбрд┐рдХ рдХрдВрдкреЛрдЬрд┐рд╢рди рдлрдВрдХреНрд╢рди рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдЬрд┐рд╕реЗ рдореИрдВ
mcompose ("
monadic compose " рд╕реЗ)
рдХрд╣рддрд╛ рд╣реВрдВред рдЙрд╕рдХреЗ рдкрд╛рд╕ рдирд┐рдореНрди рдкреНрд░рдХрд╛рд░ рд╣реИ:
mcompose :: ( a -> m b ) -> ( b -> m c ) -> ( a -> m c )
рдпрд╣ рдХрд┐рд╕реА рднреА рд╕рдиреНрдпрд╛рд╕реА рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ
IO рдореЛрдирд╛рдж рднреА рд╢рд╛рдорд┐рд▓ рд╣реИред
IO рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реБрдП, рд╣рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХреА рд╕рдВрдмрдВрдзрд┐рдд рдкрд░рд┐рднрд╛рд╖рд╛ рдорд┐рд▓рддреА рд╣реИ:
mcompose :: ( a -> IO c ) -> ( b -> IO c ) -> ( a -> IO c )
рд╣рдо рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдореЛрдирдбрд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
f рдФрд░
g ред рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рдХрд╛рд░
h рд╕рд╣реА рд╣реЛрдЧрд╛:
f :: a -> IO b
g :: b -> IO c
h :: a -> IO c
h = f `mcompose` рдЬреА
(рдпрд╣рд╛рдБ,
mcompose рдлрд╝рдВрдХреНрд╢рди рдЙрд▓реНрдЯреЗ рдПрдкреЛрд╕реНрдЯреНрд░реЛрдлрд╝реНрд╕
рд╕реЗ рдШрд┐рд░рд╛ рд╣реБрдЖ рд╣реИред рдпрд╣ рдПрдХ рд╕реБрдВрджрд░ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдЪреАрдиреА рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рджреЛ-рддрд░реНрдХ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдПрдХ infix рдСрдкрд░реЗрдЯрд░ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрд╣ рдордд рднреВрд▓реЛ рдХрд┐ рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рдХреЗрд╡рд▓ рдЙрдирдХреЗ рдСрдкрд░реЗрдВрдб рдХреЗ рдмреАрдЪ рд░рдЦрд╛ рдЧрдпрд╛ рдХрд╛рд░реНрдп рд╣реИред) рдХреБрдЫ рд░рд╣рд╕реНрдпрдордп рддрд░реАрдХреЗ рд╕реЗ (рдЕрднреА рднреА рд░рд╣рд╕реНрдпрдордп)ред ,
mcompose рдлрд╝рдВрдХреНрд╢рди (рдпрд╛ рдСрдкрд░реЗрдЯрд░, рдпрджрд┐ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ) рд╕рдХреНрд╖рдо рд╣реИ:
- рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдореВрд▓реНрдп рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВ a ;
- рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░реЗрдВ (рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╕рд╛рдорд╛рдиреНрдп рдЕрдиреБрдкреНрд░рдпреЛрдЧ) рдФрд░ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ IO b ;
- рдлрд╝рдВрдХреНрд╢рди f рд╕реЗ рдЯрд╛рдЗрдк IO b рдХрд╛ рдорд╛рди рд▓реЗрдВ рдФрд░ рдкреНрд░рдХрд╛рд░ b рдХрд╛ рдорд╛рди рдирд┐рдХрд╛рд▓реЗрдВ (рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рд╣рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ);
- рдкреНрд░рдХрд╛рд░ рдмреА рдХрд╛ рдорд╛рди рд▓реЗрдВ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдЬреА рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВ (рдлрд┐рд░ рд╕реЗ, рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╕рд╛рдорд╛рдиреНрдп рдЕрдиреБрдкреНрд░рдпреЛрдЧ) рдкреНрд░рдХрд╛рд░ рдХрд╛ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП IO c , рдЬреЛ рд╡рд╛рдВрдЫрд┐рдд рдкрд░рд┐рдгрд╛рдо рд╣реИред
рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬреЛ рд╣рдо рдЕрднреА рднреА рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рд╡рд╣ рд╣реИ рдЪрд░рдг (3) - рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рди рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
IO рдкреНрд░рдХрд╛рд░ рдХрд╛ рдорд╛рдиред рдЪрд▓реЛ рдПрдХ
рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд╕рдорд╛рд░реЛрд╣ рдХреЗ рд╕рд╛рде рдЖрддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рд╣рдо рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣рд╛рдБ рдЙрд╕рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИ:
рдЕрд░реНрдХ :: рдЖрдИрдУ рдмреА -> рдмреА
рдФрд░ рдЕрдЧрд░ рд╣рдо рд╕рднреА рднрд┐рдХреНрд╖реБрдУрдВ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ:
рдЕрд░реНрдХ :: рдПрдо рдмреА -> рдмреА
рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рдРрд╕рд╛ рдХреЛрдИ рдлрд╝рдВрдХреНрд╢рди рдореМрдЬреВрдж рд╣реИ, рддреЛ рдпрд╣ рднрд┐рдХреНрд╖реБрдУрдВ рдФрд░ рд╢реБрджреНрдз рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рд╕рднреА рд▓рд╛рднреЛрдВ рдХреЛ рд╕рдорддрд▓ рдХрд░реЗрдЧрд╛! рдПрдХ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдордареЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рдо рд╡рд┐рд╢реЗрд╖ рдЧрдгрдирд╛ рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ (рд░рд╛рдХреНрд╖рд╕реА рдХрд╛рд░реНрдпреЛрдВ) рдХреЛ рд╢реБрджреНрдз рдХрд╛рд░реНрдпреЛрдВ рд╕реЗ рдЕрд▓рдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдиреНрдпрдерд╛ рдХреЛрдИ рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рд╣реЛрдЧреА рдХрд┐ рд╢реБрджреНрдз рдХрд╛рд░реНрдп рд╢реБрджреНрдз рд╣реИрдВред рдпрд╣ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБ рд╣реИ, рдФрд░ рдореИрдВ рдЗрд╕ рдкрд░ рдереЛрдбрд╝рд╛ рд╕рдордп рдмрд┐рддрд╛рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ, рдФрд░ рдлрд┐рд░ рд╣рдо рдорда рдХреА рд░рдЪрдирд╛ рдкрд░ рд▓реМрдЯреЗрдВрдЧреЗред
* рд╕реАрдорд╛рдВрдд рдиреЛрдЯред * рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХреБрдЫ рд╕рд╛рдзреБрдУрдВ рдХреЗ рд▓рд┐рдП рдЕрд░реНрдХ рд╕рдорд╛рд░реЛрд╣ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореБрдЭреЗ рдпрд╣ рдХрд╣рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд╕рднреА рдореЛрдирдбреНрд╕ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдЕрд░реНрдХ рдлрд╝рдВрдХреНрд╢рди рдирд┐рд╖рд┐рджреНрдз рд╣реИред
рд╣рдо рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдмрд┐рдирд╛ рд╡рд┐рдЪрд┐рддреНрд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрд╛рд░реНрдп рд╢реБрджреНрдз рд╣реЛрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ, рдореЛрдиреИрдбрд┐рдХ рдлрд╝рдВрдХреНрд╢рди рд╢реБрджреНрдз рд╣реЛрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЙрдиреНрд╣реЗрдВ рд╢реБрджреНрдз рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдПрдХ рдореЛрдирдбрд┐рдХ рдореВрд▓реНрдп рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕ рдмрд╛рдд рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЧреИрд░-рдореМрджреНрд░рд┐рдХ (рд╢реБрджреНрдз) рдХрд╛рд░реНрдп рднреА рдорд╛рдирд╕рд┐рдХ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рдлрд┐рд░ рд╡реЗ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕рд╛рдл рд╣реЛрдВрдЧреЗред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╢реБрджреНрдз
hh рдкреНрд░рдХрд╛рд░ рдХрд╛ рдХрд╛рд░реНрдп
hh :: a -> c
рдХрднреА рднреА рдПрдХ рд░реАрдб / рд░рд╛рдЗрдЯ рдСрдкрд░реЗрд╢рди (рдПрдХ рдлрд╝рд╛рдЗрд▓ рдпрд╛ рдХрдВрд╕реЛрд▓ рдХреЗ рд╕рд╛рде) рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЕрдиреНрдпрдерд╛ рдЗрд╕рдХрд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП
hh :: a -> IO c
рдЗрд╕ рддрд░рд╣ рдХреА рдЧрд╛рд░рдВрдЯреА, рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рдкреНрд░рдгрд╛рд▓реА рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд, рд╣рд╛рд╕реНрдХреЗрд▓ рдХреА рдореБрдЦреНрдп рддрд╛рдХрдд рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рд╡реЗ рд╣рдореЗрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдореЗрдВ, 100% рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдЗрдирдкреБрдЯ / рдЖрдЙрдЯрдкреБрдЯ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП) рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕
рдПрдХреНрд╕реНрдЯреНрд░реЗрдХреНрдЯ рдлрдВрдХреНрд╢рди рдерд╛, рддреЛ рд╣рдо
hh рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ - рдЕрд╢реБрджреНрдз рд╕реЗ рдорд╛рдирд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рд╢реБрджреНрдз рдлрдВрдХреНрд╢рди, I / O рдХрд╛ рд╕рдВрдЪрд╛рд▓рди рдХрд░рдирд╛:
ff :: a -> IO b
gg :: b -> c
hh = ff >> рдЕрд░реНрдХ >> gg - рдпрд╛ рдПрдХ рд╣реА рдЪреАрдЬ: hh = ggред рдирд┐рдХрд╛рд▓реЗрдВред рдПрдлрдПрдл
рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдпрд╣ рдХрднреА рднреА рдЗрд░рд╛рджрд╛ рдирд╣реАрдВ рдерд╛ рдХрд┐
hh рдлрд╝рдВрдХреНрд╢рди I / O рдХрд░реЗрдЧрд╛, рддреЛ рдЖрдк рдЗрд╕реЗ рдЕрд░реНрдХ рдФрд░ рд╕рд╛рдорд╛рдиреНрдп рд░рдЪрдирд╛ рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░
hh рдкреНрд░рдХрд╛рд░ рд╕рд╛рдл рд╣реЛрдЧрд╛ - рд▓реЗрдХрд┐рди рдЕрдВрджрд░, I / O рд╕рдВрдЪрд╛рд▓рди рдЕрднреА рднреА рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдФрд░ рд╢реБрджреНрдз рдЧрдгрдирд╛рдУрдВ рд╕реЗ
IO (рд╕рд╛рде рд╣реА рдЕрдиреНрдп рд╡рд┐рд╡рд╛рджрд╛рд╕реНрдкрдж рдЧрдгрдирд╛рдУрдВ) рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдЪрд▓реЗрдЧрд╛ред (рд▓реЗрдХрд┐рди рдпрд╣ рднрд┐рдХреНрд╖реБрдУрдВ рдХреЛ рдкреЗрд╢ рдХрд░рдиреЗ рдХреЗ рдореБрдЦреНрдп рдХрд╛рд░рдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред) рдзреНрдпрд╛рди рджреЗрдВ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рд╕реНрдерд┐рддрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рд╛рдзрд╛рд░рдг рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╣реЛ рд░рд╣реА рд╣реИ, рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдЙрдирдХреЗ рдкреНрд░рдХрд╛рд░ рд╕рд┐рд╕реНрдЯрдо рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рд╕рд╛рдл тАЛтАЛрд╣реИрдВред рд╣рд╛рд╕реНрдХреЗрд▓ рдХреЗ рд╡рд┐рдкрд░реАрдд, рд╣рдо рдЗрд╕рдХреЗ рд╢реБрджреНрдз рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рддрдВрддреНрд░ рдХреЛ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рдХреА рдкреНрд░рдХрд╛рд░ рдкреНрд░рдгрд╛рд▓реА, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╢реБрджреНрдз рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╢реБрджреНрдз рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рд╣рд╛рд╕реНрдХреЗрд▓ рдХреЗ рдкрд╛рд╕
рдирд┐рдХрд╛рд▓рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рдирд╣реАрдВ рд╣реИред
рдПрдХ рдЫреЛрдЯреА рд╕реА рд╕рдорд╕реНрдпрд╛ рд╣реИ рдЬреЛ рдореИрдВрдиреЗ рдЕрднреА рдХрд╣рд╛ рд╣реИ: рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдПрдХ рдЭреВрда рд╣реИред
IO рдкреНрд░рдХрд╛рд░
a -> a рдХреЗ рд╕рд╛рде рдПрдХ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдкреНрд░реАрдлреЙрд░реНрдорд┐рдпреЛ рдлрд╝рдВрдХреНрд╢рди
рд╣реИ , рдЕрд░реНрдерд╛рдд, рдпрд╣
IO рдореЛрдирд╛рдб рдХреЗ рд▓рд┐рдП
рдПрдХреНрд╕рдЯреНрд░реИрдХреНрдЯ рд╡рд░реНрдЬрди рд╣реИред рд╢рдмреНрдж "рдЕрд╕реБрд░рдХреНрд╖рд┐рдд" рдпрд╣ рд╕рдВрдХреЗрдд рджреЗрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдмрдЪрдирд╛ рдЪрд╛рд╣рд┐рдП рдпрджрд┐ рдЖрдк рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдпрд╛ рдЕрдЬреАрдм рд╡рд┐рдлрд▓рддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдирд╣реАрдВ рд╣реИрдВред рдореБрдЭреЗ рдХрднреА рднреА
рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдорд╛рд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдкрдбрд╝рд╛, рд▓реЗрдХрд┐рди рдХрд╛рдиреВрдиреА рдорд╛рдорд▓реЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рд╛рд╕реНрдХреЗрд▓ рд╕рдВрдХрд▓рдХ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдЧрд╣рд░реАред рдмрд╕ рднреВрд▓ рдЬрд╛рдУ рдореИрдВрдиреЗ рддреБрдорд╕реЗ рдХрд╣рд╛ рдерд╛ рдХрд┐, рдареАрдХ рд╣реИ? рдореИрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╢рд░реНрдорд┐рдВрджрд╛ рд╣реВрдВред рдорд╛рдлрд╝ рдХреАрдЬрд┐рдПред {3}
рд▓реЗрдХрд┐рди рдЪрд▓реЛ рдЬрд╛рд░реА рд░рдЦреЗрдВред рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░, рд╣рдордиреЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рд╣реИ: (рдП) рд░рд╛рдХреНрд╖рд╕реА рдХрд╛рд░реНрдпреЛрдВ рдХреА рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ; (рдЦ) - рд╕рд╛рдорд╛рдиреНрдп рд░рдЪрдирд╛ рд╕рдВрдЪрд╛рд▓рдХ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдХрдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ; рдФрд░ (c) - рдЖрдк
рдПрдХреНрд╕рдЯреНрд░реИрдХреНрдЯ рдлрдВрдХреНрд╢рди рд╕реЗрдЯ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкреВрд░реА рднрд╛рд╖рд╛ рдХреА рд╢реБрджреНрдзрддрд╛ рдХреЛ рдмрд┐рдЧрд╛рдбрд╝ рджреЗрддрд╛ рд╣реИред рддреЛ рд╣рдо рдХреНрдпрд╛ рдХрд░реЗрдВ?
рдЦреИрд░, рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЪрд▓реЛ
mcompose рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХреБрдЫ рд╕рд░рд▓ рдХреЗ рд╕рд╛рде рдЖрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред рдорд╛рди рд▓реЗрдВ рдХрд┐ рдХреБрдЫ рдлрд╝рдВрдХреНрд╢рди
рдореИрдкрд▓реА (
рдореЛрдиреИрдбрд┐рдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди) рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдирд┐рдореНрди рдкреНрд░рдХрд╛рд░ рд╣реИрдВ:
mapply :: m b -> ( b -> m c ) -> m c
рдФрд░ рдЕрдЧрд░ рдЖрдк рдЖрдо рд╕рд╛рдзреБрдУрдВ рд╕реЗ
IO рддрдХ рдиреАрдЪреЗ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдпрд╣ рдорд┐рд▓рддрд╛ рд╣реИ:
mapply :: IO b -> ( b -> IO c ) -> IO c
рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рдСрдкрд░реЗрдЯрд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреА рд╕рдорд╛рдирддрд╛ рдХреЗ рдХрд╛рд░рдг рдЗрд╕реЗ
рдореИрдкрд▓реА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕реНрдорд░рдг рдХрд░реЛ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдСрдкрд░реЗрдЯрд░
> $> , рдкрд╣рд▓реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
( > $> ) :: рдмреА -> ( рдмреА -> рд╕реА ) -> рд╕реА
рдХреЗрд╡рд▓
mapply рдХреЗ рд░реВрдк рдореЗрдВ рд╣реА, рдХреЛрдИ "m" рдирд╣реАрдВ рд╣реИрдВ (рдкреНрд░рдХрд╛рд░
рд░рд╛рдХреНрд╖рд╕реА рдирд╣реАрдВ рд╣реИрдВ)ред
mcompose рдХреЛ рддреБрдЪреНрдЫ рд░реВрдк рд╕реЗ рд╡реНрдпрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
mcompose :: ( a -> m b ) -> ( b -> m c ) -> ( a -> m c )
mcompose f g x = ( f x ) `mapply` g - рдпрд╛: mapply (f x) g
рдЪреВрдВрдХрд┐ рдЯрд╛рдЗрдк рдбреЗрдлрд┐рдирд┐рд╢рди рдореЗрдВ рдПрд░реЛ (
-> ) рд░рд╛рдЗрдЯ-рдПрд╕реЛрд╕рд┐рдПрдЯрд┐рд╡ рд╣реИ, рд╣рдо рдЕрдВрддрд┐рдо рдПрд▓рд┐рдореЗрдВрдЯ рдХреЗ рдХреЛрд╖реНрдардХреЛрдВ рдХреЛ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ:
mcompose :: ( a -> m b ) -> ( b -> m c ) -> a -> m c
mcompose f g x = ( f x ) `mapply` рдЬреА
рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐
рдореЛрдореНрдореЛрд╕ рдХреЗ рдЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдкрд┐рдЫрд▓реЗ рдПрдХ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╕рдордЭрдирд╛ рдЖрд╕рд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рд╡реЗ рдПрдХ рдФрд░ рдПрдХ рд╣реА рд╣реИрдВред рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐
x рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛
рд╣реИ , рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдкреНрд░рдХрд╛рд░
mc рд╣реИ ред рд╣рдо рдпрд╣рд╛рдВ рдХреНрдпрд╛ рдХрд░рддреЗ рд╣реИрдВ: рд╣рдо рдкреНрд░рдХрд╛рд░
mb рдХрд╛ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдХреЛ
x рдкрд░ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ; рддрдм рд╣рдо рдЗрд╕ рдкреНрд░рдХрд╛рд░ (рдкреНрд░рдХрд╛рд░
mb ) рдФрд░ рдлрд╝рдВрдХреНрд╢рди
g рдХреЗ mapply рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдмреНрдпрд╛рдЬ рдХреЗ рдкреНрд░рдХрд╛рд░
mc рдХрд╛ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рд▓рд┐рдП
рдХрд╣реАрдВ рди рдХрд╣реАрдВ mcompose рдлрдВрдХреНрд╢рди рд╣реЛрдирд╛ рдЕрдирд╛рд╡рд╢реНрдпрдХ
рд╣реИ ; рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА
mapply рд╣реИ , рддреЛ
рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣рдо рдЦреБрдж
mcompose рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ,
рдордкреНрдкрд▓реА рджреЛ рдореМрд▓рд┐рдХ
рдореМрджреНрд░рд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рдЗрд╕реЗ рдЖрдорддреМрд░ рдкрд░ "рдмрд╛рдЗрдВрдб" рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдПрдХ рдкреНрд░рддреАрдХрд╛рддреНрдордХ рдЗрдиреНрдлрд┐рдХреНрд╕ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ
>> = :
( >> = ) :: рдПрдо рдП -> ( рдП -> рдПрдо рдмреА ) -> рдПрдо рдмреА
рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЯрд╛рдЗрдк рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рдереЛрдбрд╝рд╛ рдмрджрд▓ рджрд┐рдпрд╛:
рдмреА рдХреЗ рд╕рд╛рде
рдП рдФрд░
рд╕реА рдХреЗ рд╕рд╛рде
рдмреА рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ред рд▓реЗрдХрд┐рди рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ, рдЪреВрдВрдХрд┐
рдП ,
рдмреА ,
рд╕реА рдЯрд╛рдЗрдк рдЪрд░ рд╣реИрдВ, рд╡реЗ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред
рдореИрдВ рдЗрд╕ рдмрд╛рдд рдкрд░ рдЬреЛрд░ рджреЗрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐
>> = рдСрдкрд░реЗрдЯрд░ рдЕрддреНрдпрдзрд┐рдХ рд╕рд╛рд░ рд╣реИред рдЗрд╕рдХрд╛ рдкрд╣рд▓рд╛ рддрд░реНрдХ рдкреНрд░рдХрд╛рд░
рдорд╛ рдХрд╛ рдПрдХ рдореВрд▓реНрдп рд╣реИ, рдЬрд╣рд╛рдВ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдХреЛрдИ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░
рдореАрдЯрд░ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХрд╛ рд░рдЪрдирд╛рдХрд╛рд░ рд╣реИред рджреВрд╕рд░рд╛ рддрд░реНрдХ рдлрд╝рдВрдХреНрд╢рди
a -> mb рд╣реИ , рдЬрд╣рд╛рдВ
a рдФрд░
b рднреА рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░
m , рдлрд┐рд░ рд╕реЗ, рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╣реЛрддрд╛ рд╣реИред рдЕрдВрдд рдореЗрдВ, рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдЯрд╛рдЗрдк
mb рдХрд╛ рд╣реИ , рдЬрд╣рд╛рдБ
b рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░
m рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдореЛрдирдбрд┐рдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред (рдЕрдиреБрднрд╡реА рд╣рд╛рд╕реНрдХреЗрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛рдПрдВ рджреВрд╕рд░реА рдкреНрд░рдХреГрддрд┐ рдмрди рдЬрд╛рддреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╢реБрд░реБрдЖрддреА рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред) рдЖрдк
IO рд╕рдирдХ рд╕реЗ рдкрд╣рд▓реЗ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░
IO рд╕рдирдХ рдкрд░ рдПрдХ рдореЛрдирдбрд┐рдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдСрдкрд░реЗрдЯрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
( >> = ) :: IO a -> ( a -> IO b ) -> IO b
рд╣рдо рдЬрд▓реНрдж рд╣реА рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рд╣рд╛рд╕реНрдХреЗрд▓ рдкреНрд░рдХрд╛рд░ рдкреНрд░рдгрд╛рд▓реА рдЖрдкрдХреЛ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рднрд┐рдХреНрд╖реБрдУрдВ рдХреЗ рд▓рд┐рдП рдЬреЗрдиреЗрд░рд┐рдХ рдСрдкрд░реЗрдЯрд░
= = рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИ (рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реИ, рдареАрдХ рд╣реИ?)ред
рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ
>> = рдСрдкрд░реЗрдЯрд░ рд╣реИ, рдЗрд╕рдХреЗ рд╕рд╛рде рд╣рдо
h рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП
f рдФрд░
g рдХреЛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ:
- рдорд╛рди рд▓реАрдЬрд┐рдП рд╣рдореЗрдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
рдПрдл :: рдП -> рдПрдо рдмреА
g :: b -> m c
- рдПрдЪ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛:
h :: a -> m c
h x = f x >> = g
рд╣рдо рджреВрд╕рд░реЗ рддрд░реАрдХреЗ рд╕реЗ
h рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
h = \ x -> f x >> = g
рдЬрд╣рд╛рдВ
\ x -> ... рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╣рд╛рд╕реНрдХреЗрд▓ {4} рдореЗрдВ рдЕрдирд╛рдо рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдкрджрдирд╛рдо (рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрдХ рддрд░реНрдХ
x рдХреЗ рд╕рд╛рде );
h рдХреЗ рджреЛрдиреЛрдВ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХрд╛ рдорддрд▓рдм рдПрдХ рд╣реА рд╣реИред
Mcompose рдХрд╛ рдЙрдкрдпреЛрдЧ
рдХрд░рдХреЗ , рд╣рдо рдЗрд╕ рд╕рдореАрдХрд░рдг рдХреЛ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
h = f `mcompose` g = mcompose f g = \ x -> ( f x >> = g )
рдпрд╣реА рд╣реИ, рд╣рдорд╛рд░реЗ
mcompose рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
mcompose f g = \ x -> ( f x >> = g )
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рд╛рд╕реНрдХреЗрд▓ рдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдорд╛рдирдХ рд░рдЪрдирд╛ рд╕рдВрдЪрд╛рд▓рдХ рд╣реИ
> => :
f > => g = \ x -> ( f x >> = g ) рдХреЗ рд░реВрдк рдореЗрдВ рд╣реА рд╣реИ (f `mcompose` рдЫ) рд▓реЗрдХрд┐рди рдХрдоред
рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдореЛрдирдбрд┐рдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдСрдкрд░реЗрдЯрд░ рд╣реИ
= = , рд╣рдо рдЖрд╕рд╛рдиреА рд╕реЗ рдореЛрдиреИрдбрд┐рдХ рдХрдВрдкреЛрдЬрд┐рд╢рди рдСрдкрд░реЗрдЯрд░
> => рд╕реЗрдЯ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдереЗред рдЗрд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдореЛрдиреИрдбрд┐рдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдСрдкрд░реЗрдЯрд░ (рдмрд╛рдЗрдВрдб рдСрдкрд░реЗрдЯрд░) рд╡реИрдЪрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдЖрдЧреЗ рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрдиреНрдпрд╛рд╕реА рдХреЗ рд▓рд┐рдП рдЙрд╕рдХрд╛ рдЕрдкрдирд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрдЪрд╛рд▓рдХ
>> = рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИ, рдЬреЛ рдЕрдиреНрдп рд╕рднреА рд╕реЗ рдЕрд▓рдЧ рд╣реИ; рд╣рд╛рд╕реНрдХреЗрд▓ рдкреНрд░рдХрд╛рд░ рдХреА рдХрдХреНрд╖рд╛рдПрдВ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдХрд░рддреА рд╣реИрдВред рд╡реИрд╕реЗ, рдЬреАрдПрдЪрд╕реА рдХрдВрдкрд╛рдЗрд▓рд░ рдореЗрдВ,
> => рдСрдкрд░реЗрдЯрд░
рдХрдВрдЯреНрд░реЛрд▓ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдореЙрдбрд▓ рдореЙрдбреНрдпреВрд▓ред
рдЕрдм рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдордиреЗ рд╕рд╛рдорд╛рдиреНрдп рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдСрдкрд░реЗрдЯрд░ рдХреЛ рджреЛ рддрд░реАрдХреЛрдВ рд╕реЗ рд░рд┐рдХреЙрд░реНрдб рдХрд┐рдпрд╛ рд╣реИ:
( $ ) :: ( a -> b ) -> a -> b
рдФрд░
( > $> ) :: a -> ( a -> b ) -> b
рдЗрдирдореЗрдВ рд╕реЗ рдХреМрди рд╕рд╛ рдСрдкрд░реЗрдЯрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ рдпрд╣ рдЙрд╕ рдЖрджреЗрд╢ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рддрд░реНрдХ рдкрд╛рд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рдереЗред (рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛрдиреЗ рдкрд░ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛрдиреЛрдВ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИред) рд╣рдо рджреЛ рддрд░реАрдХреЛрдВ рд╕реЗ рдореЛрдирдбрд┐рдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдСрдкрд░реЗрдЯрд░ рднреА рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред рдкрд╣рд▓рд╛ рддрд░реАрдХрд╛ рдмрд╛рдЗрдВрдб рдСрдкрд░реЗрдЯрд░ рд╣реИ
= = рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде
( >> = ) :: рдПрдо рдП -> ( рдП -> рдПрдо рдмреА ) -> рдПрдо рдмреА
рдЬреЛ рд╕рд╛рдорд╛рдиреНрдп рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдСрдкрд░реЗрдЯрд░
> $> рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИред рд░рд┐рд╡рд░реНрд╕ рдСрд░реНрдбрд░ рдореЗрдВ рддрд░реНрдХ рджреЗрдиреЗ рд╡рд╛рд▓реЗ рдореЛрдиреИрдбрд┐рдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдСрдкрд░реЗрдЯрд░ рдХреЛ рддреБрдЪреНрдЫ рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
( = << ) :: ( a -> m b ) -> m a -> m b
f = << x = x >> = f
рдЖрдк
рдлреНрд▓рд┐рдк рдлрд╝рдВрдХреНрд╢рди рднреА рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рджреЛ рддрд░реНрдХреЛрдВ рдХрд╛ рдХрд╛рд░реНрдп рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдПрдХ рд╣реА рдлрд╝рдВрдХреНрд╢рди рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рддрд░реНрдХреЛрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд рдХреНрд░рдо рдХреЗ рд╕рд╛рде:
рдлреНрд▓рд┐рдк :: ( a -> b -> c ) -> ( b -> a -> c )
рдлреНрд▓рд┐рдк f = \ x y -> f y x
рдСрдкрд░реЗрдЯрд░
= << рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
( = << ) = рдлреНрд▓рд┐рдк ( >> = )
рдпрджрд┐ рдЖрдкрдХреА рдкрд░рд┐рднрд╛рд╖рд╛рдПрдБ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╕реНрдерд┐рддрд┐ рдЕрдВрдХ {5} рдорд┐рд▓реЗрдВрдЧреЗред
рдФрд░ рдлрд┐рд░ рд╕реЗ: рд╣рдо рдСрдкрд░реЗрдВрдб рдХреЗ рд░рд┐рд╡рд░реНрд╕ рдСрд░реНрдбрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдореЛрдирдбрд┐рдХ рдХрдВрдкреЛрдЬрд┐рд╢рди рдСрдкрд░реЗрдЯрд░ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
( > => ) :: ( рдП -> рдПрдо рдмреА ) -> ( рдмреА -> рдПрдо рд╕реА ) -> ( рдП -> рдПрдо рд╕реА ) - рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИ
( <= < ) :: ( b -> m c ) -> (( a -> m b ) -> ( a -> m c )
( <= < ) = рдлреНрд▓рд┐рдк ( > => )
рдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ рдСрдкрд░реЗрдВрдб рдХреЗ рдХрд┐рд╕реА рднреА рдСрд░реНрдбрд░ рдХреЗ рд▓рд┐рдП рдореЛрдиреИрдбрд┐рдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдСрдкрд░реЗрдЯрд░реНрд╕ рдФрд░ рдХрдВрдкреЛрдЬрд╝рд┐рд╢рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рд╕рд╛рдзрд╛рд░рдг (рдиреЙрди-рдореЙрдиреЗрдбрд┐рдХ) рдСрдкрд░реЗрдЯрд░реНрд╕ рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдерд╛ред рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╣рд╛рд╕реНрдХреЗрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░
>> = рдСрдкрд░реЗрдЯрд░ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ (рдпрд╛ рдХрдо рд╕реЗ рдХрдо рдореИрдВ рдЗрд╕рдХрд╛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ)ред
рдпрджрд┐ рдЖрдк рдпрд╣ рд╕рдм рд╕рдордЭрддреЗ рд╣реИрдВ, рддреЛ рдмрдзрд╛рдИ! рд╕рдмрд╕реЗ рдХрдард┐рди рд╣рд┐рд╕реНрд╕рд╛ рдкреАрдЫреЗ рд╣реИред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИред {6}
рдПрдХ рдФрд░ рдореМрд▓рд┐рдХ рдореМрджреНрд░рд┐рдХ рдСрдкрд░реЗрд╢рди рд╣реИ рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВ рдмрд╛рдд рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВред рдмреАрдЬ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░рд┐рджреГрд╢реНрдп рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдЖрдкрдХреЛ рдПрдХ рдиреЙрдирдореЙрдбрд┐рдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдПрдХ рдореЛрдиреЛрдПрдбрд┐рдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдЖрдкрдХреЗ рдкрд╛рд╕ рдпреЗ рдХрд╛рд░реНрдп рд╣реИрдВ:
f :: a -> m b - monadic
рдЬреА :: рдмреА -> рд╕реА - рдиреЙрдирдореЗрдбрд┐рдХ
рд╕рдорд╕реНрдпрд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИред рдЖрдк рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрд░рдЪрдирд╛ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ
f рдФрд░
g рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ, рдХреНрдпреЛрдВрдХрд┐
mb b рдХреЗ рд╕рдорд╛рди рдирд╣реАрдВ рд╣реИред рдФрд░ рдореЛрдиреИрдбрд┐рдХ рд░рдЪрдирд╛ рднреА рдлрд┐рдЯ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ - рдпрд╣ рдЯрд╛рдЗрдк
рдмреА -> рд╕реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рд╣реИ, рдЗрд╕реЗ рдПрдХ рдореЛрдирдбрд┐рдХ рдкреНрд░рдХрд╛рд░
рдмреА -> рдПрдорд╕реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ ред рдЖрдк рдХреНрдпрд╛ рдХрд░реЗрдВрдЧреЗ?
рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ
рдирд┐рдХрд╛рд▓рд╛ рдЧрдпрд╛ рдлрд╝рдВрдХреНрд╢рди рдерд╛, рддреЛ рдЖрдк рдЗрд╕ рддрд░рд╣ рд╕реЗ рджреЛ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ:
рдПрдЪ :: рдП -> рд╕реА
h = f >> рдЕрд░реНрдХ >> рдЬреА
рд▓реЗрдХрд┐рди рд╣рдо рдкрд╣рд▓реЗ рд╣реА рдкрддрд╛ рд▓рдЧрд╛ рдЪреБрдХреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдЕрд╕рдВрднрд╡ рд╣реИред рдпрд╣реА рд╣реИ, рд╣рдореЗрдВ рдЧреИрд░-рдореЛрдиреЛрдбрд┐рдХ рдлрд╝рдВрдХреНрд╢рди рдФрд░ рдореЛрдиреИрдбрд┐рдХ рдХреЛ рдЧреИрд░-рдореЛрдиреЛрдбрд┐рдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордирд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкреВрд░реА рднрд╛рд╖рд╛ рдХреА рд╢реБрджреНрдзрддрд╛ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░реЗрдЧрд╛)ред рдФрд░ рд╣рдореЗрдВ рдореЛрдиреИрдбрд┐рдХ рдФрд░ рдиреЙрдирдореЗрдбрд┐рдХ
рдХреЛ рд╕рдВрдпреЛрдЬрд┐рдд
рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреА рдЬрд╛рддреА рд╣реИ , рдпрджрд┐ рдкрд░рд┐рдгрд╛рдо рдлрд┐рд░ рд╕реЗ рдПрдХ рдореЛрдирдбрд┐рдХ рдлрд╝рдВрдХреНрд╢рди рд╣реЛрддрд╛ рд╣реИред рдХреБрдЫ рдЗрд╕ рддрд░рд╣:
h :: a -> m c
h = f [ рдХрд┐рд╕реА рддрд░рд╣ рдЬреА рдХреЗ рд╕рд╛рде рдЧрдардмрдВрдзрди ]
рд╡реИрд╕реЗ, рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рдореЛрдиреЛрдбрд┐рдХ рд░рдЪрдирд╛ рдЕрдЪреНрдЫреА рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐
рдЬреА рдореЗрдВ рдЧрд▓рдд рдкреНрд░рдХрд╛рд░ рд╣реИ (рдЬрд┐рд╕реЗ
b -> mc рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП)ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣
рдХрд╛рдо рдореЗрдВ рдЖрдПрдЧрд╛ рдпрджрд┐ рд╣рдо рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдХрд╛рд░реНрдп рдХреЛ рдПрдХ рдПрдХрд╛рджрд╢ рдореЗрдВ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред рдРрд╕реЗ рд░реВрдкрд╛рдВрддрд░рдг рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ functionToMonadicFunction рдХрд╣рд╛ рдЬрд╛рддрд╛
рд╣реИ ред
functionToMonadicFunction :: ( b -> c ) -> ( b -> m c )
рдПрдЪ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЕрдм рдЕрд▓рдЧ рддрд░реАрдХреЗ рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
h :: a -> m c
h = f > => ( functionToMonadicFunction рдЬреА )
рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рд╕рднреА рдХреА рдЬрд░реВрд░рдд рд╣реИ functionToMonadicFunction
рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛
рд╣реИ , рдФрд░ рдпрд╣ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдирд╛рдо (рд╕рдВрднрд╡рддрдГ рднреНрд░рд╛рдордХ)
рд╡рд╛рдкрд╕реА рдХреЗ рд╕рд╛рде рдПрдХ рдореМрдирд┐рдХ рдлрд╝рдВрдХреНрд╢рди рдореМрдЬреВрдж рд╣реИред рдЙрд╕рдХреЗ рдкрд╛рд╕ рдирд┐рдореНрди рдкреНрд░рдХрд╛рд░ рд╣реИ:
рд╡рд╛рдкрд╕реА :: a -> m a
рдЬрд╣рд╛рдБ
рдХреЛрдИ рднреА рдкреНрд░рдХрд╛рд░ рд╣реИ, рдФрд░
рдПрдо рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХрд╛
рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рд╣реИред
рд╡рд╛рдкрд╕реА рдлрд╝рдВрдХреНрд╢рди рд╕рд╛рдорд╛рдиреНрдп рдорд╛рди рдХреЛ рдХрд┐рд╕реА рднреА monad
m рдХреЗ рд▓рд┐рдП рд╕рдВрдмрдВрдзрд┐рдд рдорд╛рдирд╕рд┐рдХ рдорд╛рди рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рд╕рдм рдХрд░рддрд╛ рд╣реИред рдЕрдм рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред
рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕
рд╡рд╛рдкрд╕ рд▓реМрдЯрд╛ рд╣реИ , рддреЛ
functionToMonadicFunction рдХреЛ рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡реНрдпрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
functionToMonadicFunction :: ( a -> b ) -> ( a -> m b )
functionToMonadicFunction f = \ x -> рд╡рд╛рдкрд╕реА ( f x )
рдпрд╛, рдпрджрд┐ рдЖрдк рд╢рд╛рдВрдд рд░рд╣рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
functionToMonadicFunction :: ( a -> b ) -> ( a -> m b )
functionToMonadicFunction f = рд╡рд╛рдкрд╕реА ред рдЪ
рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐:
functionToMonadicFunction :: ( a -> b ) -> ( a -> m b )
functionToMonadicFunction = ( рд╡рд╛рдкрд╕реА )
рдЕрдВрддрд┐рдо рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, "рдЕрдиреБрднрд╛рдЧ" рдирд╛рдордХ рдПрдХ рдЕрджреНрднреБрдд рд╣рд╛рд╕реНрдХреЗрд▓ рд╕реБрд╡рд┐рдзрд╛ рд╢рд╛рдорд┐рд▓ рд╣реИред рддреАрдиреЛрдВ рд╡рд┐рдХрд▓реНрдк рдмрд░рд╛рдмрд░ рд╣реИрдВред
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдореИрдВрдиреЗ рдЯрд╛рдЗрдк рдЕрдХреНрд╖рд░реЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрджрд▓ рджрд┐рдпрд╛ рд╣реИ:
рдмреА рдХреЗ рд╕рд╛рде
рдП рдФрд░
рд╕реА рдХреЗ рд╕рд╛рде
рдмреА ; рдХрд┐рд╕ рдЕрдХреНрд╖рд░ рдореЗрдВ рд╣реЛрдЧрд╛ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ред рдЬреЛ рдХрд╣рд╛ рдЧрдпрд╛ рдерд╛ рдЙрд╕рдХрд╛ рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐
рд╡рд╛рдкрд╕реА рдХреА рдорджрдж рд╕реЗ рд╣рдо рдлрд┐рд░ рд╕реЗ рд╡рд┐рдореБрджреНрд░реАрдХрд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд╡рд╛рдкрд╕реА рджреВрд╕рд░рд╛ рдореМрд▓рд┐рдХ рдореМрджреНрд░рд┐рдХ рдСрдкрд░реЗрд╢рди рд╣реИред
* рд╕реАрдорд╛рдВрдд рдиреЛрдЯред * рдпрджрд┐ рдЖрдк рдЬреНрдпрд╛рджрд╛рддрд░ рдПрдХ рдЕрдирд┐рд╡рд╛рд░реНрдп рд╢реИрд▓реА рдореЗрдВ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╡рд╛рдкрд╕реА рд╢рдмреНрдж рдЖрдкрдХреЛ рдереЛрдбрд╝рд╛ рдХрд╖реНрдЯрдкреНрд░рдж рд▓рдЧ рд╕рдХрддрд╛ рд╣реИред рдмрд╕ рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдпрд╣ рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рдПрдХ рдХреАрд╡рд░реНрдб рдирд╣реАрдВ рд╣реИ , рдФрд░ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдХреБрдЫ рднреА рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИред рдПрдХ рдЕрдирд┐рд╡рд╛рд░реНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдореЗрдВ рд╡рд╛рдкрд╕реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВред
рдирд╛рдо "рд╡рд╛рдкрд╕реА" рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ "рдХрд╛рд░реНрдпреЛрдВ" рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд┐рдЪрд┐рддреНрд░ рдЕрд░реНрдереЛрдВ рдХреА рд╕рдордЭ рд╕реЗ рдЖрдпрд╛ рд╣реИред рдЗрд╕ рдЕрд░реНрде рдореЗрдВ,
рд╡рд╛рдкрд╕реА рдлрд╝рдВрдХреНрд╢рди рдПрдХ рд╕рд░рд▓ рдореВрд▓реНрдп рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдПрдХ рдорд╛рдирджрдВрдб рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдореМрджреНрд░рд┐рдХ рдЕрд░реНрде рдкрд╣рд▓реЗ рд╕реЗ рд╣реА "рдХреБрдЫ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ", рдФрд░ рдкрд░рд┐рдгрд╛рдо рдореВрд▓ рдЕрд░реНрде рд╣реЛрдЧрд╛ред рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ,
рд╡рд╛рдкрд╕реА рдПрдХ рд░рд╛рдХреНрд╖рд╕реА рдХрд╛рд░реНрдп рд╣реИред рдЗрди рджреЛ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде рд░рдЦрддреЗ рд╣реБрдП, рдЖрдк рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ (рдпрд╛ рдХрдо рд╕реЗ рдХрдо рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рддреЗ рд╣реИрдВ) рдХрд┐
рд╡рд╛рдкрд╕реА рдкрд╣рдЪрд╛рди рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдорд╛рдирд╕рд┐рдХ рд╕рдВрд╕реНрдХрд░рдг рд╣реИ (рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдорд╛рди рдХреЛ рд╕реНрд╡рдпрдВ рдХреЗ рд▓рд┐рдП рдореИрдк рдХрд░рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд,
\ x -> x )ред рд╣рдо рдЗрд╕ рдкрд░ рд▓реМрдЯреЗрдВрдЧреЗ рдЬрдм рд╣рдо рд░рд╛рдХреНрд╖рд╕реА рдХрд╛рдиреВрдиреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред
рдЖрдЗрдП, рдЕрдкрдиреЗ рдореЛрдиреИрдбрд┐рдХ рдлрдВрдХреНрд╢рди
f рдХреЛ рдиреЙрди-рдореЛрдиреИрдбрд┐рдХ рдлрдВрдХреНрд╢рди
g рдХреЗ рд╕рд╛рде monadic
h рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░реНрдХреБрд▓реЗрд╢рди рдореЗрдВ рд╡рд╛рдкрд╕ рд▓рд╛рдПрдВред
h = f > => ( рд░рд┐рдЯрд░реНрди рдЬреА ред )
рдФрд░ рдпрд╣
рд╡рд╛рдкрд╕реА рдХреЗ рдмрд╛рдж рд╕реЗ рд╕рд╣реА рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рд╣реИ
ред g рдПрдХ monadic рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП
g рдХреЛ рдХрдирд╡рд░реНрдЯ рдХрд░рддрд╛ рд╣реИред
рдЖрдЦрд┐рд░рдХрд╛рд░, рдпрд╣ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ, рдЖрдк рд╢рд╛рдпрдж рдЖрд╢реНрдЪрд░реНрдп рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЙрди рд╕рднреА рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╣рдореЗрдВ рдФрд░ рдХрд┐рддрдиреЗ рдореМрджреНрд░рд┐рдХ рд╕рдВрдЪрд╛рд▓рди рдХрд░рдиреЗ рд╣реЛрдВрдЧреЗред рдЬреИрд╕рд╛ рдХрд┐ рдкреНрд░реЛрдлреЗрд╕рд░ рдлрд╝рд╛рд░реНрдиреНрд╕рд╡рд░реНрде рдХрд╣рддреЗ рдереЗ: "рдЕрдЪреНрдЫреА рдЦрдмрд░!" рдЙрдирдореЗрдВ рд╕реЗ рдХреЗрд╡рд▓ рджреЛ рд╣реИрдВ! рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ рдХреБрдЫ рдФрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕рдВрдЪрд╛рд▓рди рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛, рд▓реЗрдХрд┐рди рдЙрдирдореЗрдВ рд╕реЗ рдХреЗрд╡рд▓
= = рдФрд░
рд╡рд╛рдкрд╕реА рд╣реА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред
рд╡рд╛рдкрд╕реА рдХреЗ рд╕рд╛рде рдПрдХ рдФрд░ рдЕрдЬреАрдмреЛрдЧрд░реАрдм рдкрд▓ рд╣реИред рдРрд╕рд╛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐
рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░
рдПрдХ -> рдорд╛ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИред рдЬрдм рд╣рдо рдХрд╣рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
10 рд▓реМрдЯреЗрдВ , рддреЛ рдЗрд╕ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдкреНрд░рдХрд╛рд░ рдХреНрдпрд╛ рд╣реЛрдЧрд╛? рдпрд╣
IO Int ,
рд╣реЛ рд╕рдХрддрд╛ рд╣реИ Int, рдпрд╛ рдХреБрдЫ рдЕрдиреНрдп monadic
Int рд╣реЛ рд╕рдХрддрд╛ рд╣реИ ред рд╣рдореЗрдВ рдХреИрд╕реЗ рдкрддрд╛ рдЪрд▓реЗрдЧрд╛ рдХрд┐ рдпрд╣рд╛рдВ рдХрд┐рд╕ рддрд░рд╣ рдХрд╛ рдореЛрдирд╛рдб рд╣реИред рдЖрдЦрд┐рд░рдХрд╛рд░,
IO Int рдХрд╛ рдореЛрдиреИрдбрд┐рдХ рдЕрд░реНрде рд╕рдорд╛рди
рдЗрдВрдЯ рдХреЗ рд╕рдорд╛рди рдирд╣реАрдВ рд╣реИ; рдЗрд╕рд▓рд┐рдП рд╣рдо рдХреЗрд╡рд▓ рд╕рд╣реА рдкреНрд░рдХрд╛рд░ рдореЗрдВ рд░реБрдЪрд┐ рдирд╣реАрдВ рд░рдЦрддреЗ рд╣реИрдВ, рд╣рдо рдпрд╣ рд╕рдордЭрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ
рдХрд┐ рдпрд╣ рдорд╛рди
рдХреНрдпрд╛ рд╣реИ -
10 рд▓реМрдЯреЗрдВ !
рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ,
рд╡рд╛рдкрд╕реА 10 рдХрд╛ рдЕрд░реНрде рд╕рдВрджрд░реНрдн рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реЛрддрд╛ рд╣реИред рдкреНрд░рдХрд╛рд░ рдЪреЗрдХрд░ рдХреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рд╕рд╣реА рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рддрд░реНрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐
рд░рд┐рдЯрд░реНрди 10 рдХреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди
рд╕реЗ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ
IO Int рдХреА рдЙрдореНрдореАрдж рд╣реИ, рддреЛ
рд╡рд╛рдкрд╕реА 10 рдХреЛ
IO Int рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рдПрдЧрд╛ред (рдЕрдиреНрдп рдореБрдирд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рднреА рдпрд╣реА рдирд┐рдпрдо рд╕рд╣реА рд╣реИред) рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ,
рд░рд┐рдЯрд░реНрди 10 рдХрд╛ рдореВрд▓реНрдп рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕ рд╕рдВрджрд░реНрдн рдореЗрдВ рдкреНрд░рдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдЪрд╛рд╣реЗрдВ, рддреЛ рдЖрдк рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ
рд░рд┐рдЯрд░реНрди 10 рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд░рд┐рдХреЙрд░реНрдб (
рд╡рд╛рдкрд╕реА 10 :: рдЖрдИрдУ рдЗрдВрдЯ ), рд▓реЗрдХрд┐рди рдпрд╣ рд╢рд╛рдпрдж рд╣реА рдХрднреА рдЖрд╡рд╢реНрдпрдХ рд╣реИред
рдЬреЛ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ рдЙрд╕рдХрд╛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рд╡рд░реНрдгрди рдХрд░рдирд╛ред
- : ┬лbind┬╗ ( >>= ) return .
- Bind- тАФ . , : >=> .
- return . .
?
рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░, рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдореЛрдиреИрдбрд┐рдХ рд░рдЪрдирд╛ рдФрд░ рдореЛрдиреИрдбрд┐рдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рддрдВрддреНрд░ рдХреЛ рд╕рдордЭрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдпрд╣ рдЙрдирдХреЗ рдЕрд░реНрде рдХреЛ рд╕рд╣рдЬ рд░реВрдк рд╕реЗ рд╕рдордЭрдиреЗ рдЬреИрд╕рд╛ рдирд╣реАрдВ рд╣реИред рдЖрдЗрдП рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВредрдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ рдХрд╣рд╛ рдХрд┐ рдЖрдк рдПрдХ рдРрд╕реЗ рдЕрд░реНрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдореВрд▓реНрдп рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдмрд╛рдд рдХрд░реЗрдЧрд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЕрдЧрд░ рд╣рдореЗрдВ рджреЛ рдореЛрдиреИрдбрд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдПрдХ рддрд┐рд╣рд╛рдИ рдореЗрдВ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╣рдореЗрдВ рдЕрднреА рднреА рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдиреЛрдВ рдХреЛ рдирд┐рдХрд╛рд▓рдирд╛ рд╣реЛрдЧрд╛ред( >=> ) :: ( a -> m b ) -> ( b -> m c ) -> ( a -> m c )
f >=> g = {- - -}
рдпрд╣рд╛рдБ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ: рдлрд╝рдВрдХреНрд╢рди рдПрдл рдЯрд╛рдЗрдк a рдХрд╛ рдорд╛рди рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЯрд╛рдЗрдк mb рдХрд╛ рдПрдХ рдорд╛рди рдореВрд▓реНрдп рджреЗрддрд╛ рд╣реИ ; function g рдЯрд╛рдЗрдк b рдХрд╛ рдорд╛рди рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдкреНрд░рдХрд╛рд░ mc рдХрд╛ рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИ ред рдФрд░ рдпрд╣, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдЕрдВрджрд░ рдХрд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИ, рд╕рд╛рдорд╛рдиреНрдп рдЕрд░реНрде "рдЕрдирдкреИрдХрдб" рд╣реИ рдЬреЛ рдореЛрдирдбрд┐рдХ рд╕реЗ рд╣реИред рд╣рдордиреЗ рдЗрд╕ рдмрд╛рдд рдкрд░ рднреА рдЪрд░реНрдЪрд╛ рдХреА рдХрд┐ рд╣рдо рдПрдХ рд╡реИрдпрдХреНрддрд┐рдХ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ > = >> рдореЛрдиреИрдбрд┐рдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди ( >> = ) рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ ред рдлрд┐рд░ рд╕реЗ рджреЗрдЦрд┐рдП >> = :( >>= ) :: m b -> ( b -> m c ) -> m c
mv >>= g
рдЬрд╣рд╛рдВ mv рдкреНрд░рдХрд╛рд░ рдХреЗ рдХреБрдЫ monadic рдореВрд▓реНрдп рд╣реИ рдПрдордмреА ред рдФрд░ рднреА - рдХрд┐рд╕реА рднреА рдмрд┐рдирд╛ рдирд┐рдХрд╛рд▓рдиреЗ , - рдХреИрд╕реЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рдореВрд▓реНрдп рд╣реИ рдЦ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рдореВрд▓реНрдп рдХреЗ рдПрдордмреА рд╕рдорд╛рд░реЛрд╣ рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА, рдЬреА ?рд╕рднреА рдордареЛрдВ рдХрд╛ рдЙрддреНрддрд░ рдЕрд▓рдЧ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдореЛрдирд╛рдб рдХрд╛ рдЕрдкрдирд╛ "рдЕрдирдкреИрдХрд┐рдВрдЧ" рдХрд░рдиреЗ рдХрд╛ рдЕрдкрдирд╛ рддрд░реАрдХрд╛ рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдПрдХ рджреВрд╕рд░реЗ рдореЙрдирд╛рдбрд┐рдХ рдлрдВрдХреНрд╢рди рдореЗрдВ рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЙрдиреЗрдбрд┐рдХ рдХрд╛ рдЕрд░реНрде рд╣реИред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, >> = рдСрдкрд░реЗрдЯрд░ рд╕рднреА рдордареЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдпрд╣ рдЫрд┐рдкрд╛ рд╣реБрдЖ рд╣реИ рдХрд┐ рдХреИрд╕реЗ рдорд╛рдирджрд┐рдХ рдореВрд▓реНрдп рдХреЛ рдЕрдирдкреИрдХ рдХрд┐рдпрд╛ рдФрд░ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рд╕рдиреНрдпрд╛рд╕реА рдХрд╛ рдЕрдкрдирд╛ рд╡рд┐рд╡рд░рдг рднреА рд╣реЛрддрд╛ рд╣реИ редрдЕрдм рд╕реЗ, рдореИрдВ рдордирдорд╛рдиреЗ рдордареЛрдВ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдереЛрдбрд╝реА рдЕрд▓рдЧ рд╢рдмреНрджрд╛рд╡рд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ред >> = рдСрдкрд░реЗрдЯрд░ рдПрдХ рдЗрдирдкреБрдЯ рдореЛрдиреИрдбрд┐рдХ рдорд╛рди рд▓реЗрддрд╛ рд╣реИ (рдЬрд┐рд╕реЗ "рдПрдХреНрд╢рди" рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ), "рдЕрдирдкреИрдХ" рдЗрд╕реЗ рдПрдХ рдирд┐рдпрдорд┐рдд (рдЧреИрд░-рдореЛрдиреЛрдбрд┐рдХ) рдорд╛рди рдореЗрдВ (рд╕рднреА рдореЛрдирдбреЙрдХреНрд╕ рдХреЗ рд▓рд┐рдП рдЕрдирдкреИрдХрд┐рдВрдЧ рдЕрд▓рдЧ-рдЕрд▓рдЧ рджрд┐рдЦрддрд╛ рд╣реИ), рдФрд░ рдлрд┐рд░ рдЙрд╕ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рди рдХреЛ рдПрдХ рдореЛрдиреЛрдПрдб рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдЕрджреНрд╡реИрдд рдЕрд░реНрде ("рдХреНрд░рд┐рдпрд╛") рдкреИрджрд╛ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИредрдЕрдм рдЬрдм рд╣рдо рдпрд╣ рд╕рдм рдЬрд╛рди рдЧрдП рд╣реИрдВ, рддреЛ рдЪрд▓рд┐рдП рдореЛрдирд╛рдб рдЯрд╛рдЗрдк рдХреНрд▓рд╛рд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ ред рдмрд╛рдж рдореЗрдВ рд╣рдо рдХреБрдЫ рднрд┐рдХреНрд╖реБрдУрдВ рдХреЗ рд▓рд┐рдП >> = рдСрдкрд░реЗрдЯрд░ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рджреЗрдЦреЗрдВрдЧреЗ , рдФрд░ рдЖрдк рд╕реАрдЦреЗрдВрдЧреЗ рдХрд┐ рд╡рд╣рд╛рдВ рдХреИрд╕реЗ рдЕрдирдкреИрдХрд┐рдВрдЧ рдХреА рдЬрд╛рддреА рд╣реИредрдореЛрдирд╛рдб рдЯрд╛рдЗрдк рдХреНрд▓рд╛рд╕
>> = - рдпрд╣ рдореЛрдиреИрдбрд┐рдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдСрдкрд░реЗрдЯрд░ рд╣реИ, рдФрд░ рд░рд┐рдЯрд░реНрди - рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рдореВрд▓реНрдп рдХреЛ рдХрд┐рд╕реА рднреА рдореЛрдиреЛрдбрд┐рдХ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рд╣реИред рддреЛ рдореИрдВрдиреЗ рдКрдкрд░ рдХрд╣рд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рд╢рдмреНрджрд╛рд╡рд▓реА рд╕рдЯреАрдХ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рднреА рдХрд╣рд╛ рдЧрдпрд╛ рдерд╛ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрдиреНрдпрд╛рд╕реА рдХреЗ рдкрд╛рд╕ рдЗрди рдСрдкрд░реЗрдЯрд░реЛрдВ / рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдЕрдкрдиреЗ рд╕рдВрд╕реНрдХрд░рдг рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП рдЬреЛ рджреВрд╕рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рд╣реИрдВред рджреВрд╕рд░реА рдУрд░, >> = рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдФрд░ рд╡рд┐рд╡рд░рдгреЛрдВ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИ ред рд╣рдо рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЧрдВрджрд╛ рдЪреАрдЬреЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗ:IO >>= :: IO a -> ( a -> IO b ) -> IO b
IOreturn :: a -> IO a
Maybe >>= :: Maybe a -> ( a -> Maybe b ) -> Maybe b
Maybereturn :: a -> Maybe a
рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рдореИрдВрдиреЗ рдЬреЛ рд▓рд┐рдЦрд╛ рд╣реИ, рд╡рд╣ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЪреЗрдХ рдкрд╛рд╕ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдЖрдк рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдореЗрдВ рд╡рд░реНрдгрдорд╛рд▓рд╛ рдФрд░ рдЧреИрд░-рдЕрдХреНрд╖рд░ рд╡рд░реНрдгреЛрдВ рдХреЛ рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЖрдк рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкрд╣рд▓реЗ рдЕрдХреНрд╖рд░ рдХреЛ рдХреИрдкрд┐рдЯрд▓ рдореЗрдВ рдирд╣реАрдВ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВредрд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд╕реНрдХреЗрд▓ рднрд╛рд╖рд╛ рдХреЗ "рдкреНрд░рдХрд╛рд░ рд╡рд░реНрдЧ" рджреНрд╡рд╛рд░рд╛ рдЦреВрдмрд╕реВрд░рддреА рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред (рдпрд╛рдж рд░рдЦреЗрдВ, рдореИрдВрдиреЗ рдХрд╣рд╛ рдерд╛ рдХрд┐ рдпрджрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЯрд╛рдЗрдк рдХреНрд▓рд╛рд╕ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ рддреЛ рдореИрдиреБрдЕрд▓ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдЯрд╛рдЗрдк рдХреА рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдУрдУрдкреА рд╕реЗ рдХрдХреНрд╖рд╛рдУрдВ рд╕реЗ рдХреЛрдИ рд▓реЗрдирд╛-рджреЗрдирд╛ рдирд╣реАрдВ рд╣реИ, рдпреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдЪреАрдЬреЗрдВ рд╣реИрдВред рд╣рд╛рд╕реНрдХреЗрд▓ рдЯрд╛рдЗрдк рдХреНрд▓рд╛рд╕ рдХрдВрдкрд╛рдЗрд▓-рдЯрд╛рдЗрдо рдЗрдВрдЯрд░рдлреЗрд╕ рдХреА рддрд░рд╣ рд╣реИрдВ) рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╡рд░реНрдЧ рдпрд╣ рдХрд╣рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ рдХрд┐ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдПрдХ рд╕рдореВрд╣ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА рдирд╛рдо (рдпрд╛ рдСрдкрд░реЗрдЯрд░) рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдЕрд╡рддрд╛рд░ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Eq рдкреНрд░рдХрд╛рд░ рд╡рд░реНрдЧ рдореЗрдВ a = > a -> рдмреВрд▓ (рдЬрд╣рд╛рдВ рд╕рднреА рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рд╣реИ) рдХреЗ рд╕рд╛рде == рдСрдкрд░реЗрдЯрд░ рд╣реЛрддрд╛ рд╣реИ ред рдЯрд╛рдЗрдк рдХрд░рдирд╛ рд╣реИрдПрдХ рд╡рд░реНрдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдВрддрд░реНрдЧрдд рдЖрддрд╛ рд╣реИ Eq , рдЙрдкрдпреБрдХреНрдд рдСрдкрд░реЗрдЯрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдореМрдЬреВрдж рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП == (рд╕рдорд╛рдирддрд╛ рддреБрд▓рдирд╛)ред рдЕрдВрдХреАрдп рдкреНрд░рдХрд╛рд░ Int рдФрд░ Float Eq рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╡рд░реНрдЧ рдХреЗ рд╣реЛрддреЗ рд╣реИрдВ (рд╣рдо рдпрд╣ рднреА рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗ Eq рд╡рд░реНрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ ), рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХрд╛ рдЕрдкрдирд╛ рд╕рд╛рд░реНрдердХ рд╕рдВрдЪрд╛рд▓рдХ == рд╣реИ ред рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ:class Eq a where
( == ) :: a -> a -> Bool
instance Eq Int where
( == ) = intEquals -- intEquals : (Int -> Int -> Bool)
instance Eq Float where
( == ) = floatEquals -- floatEquals : (Float -> Float -> Bool)
рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ intEquals - рдХреЗ рд▓рд┐рдП рддреБрд▓рдирд╛ рд╕рдорд╛рд░реЛрд╣ рд╣реИ рдЗрдВрдЯ , рдФрд░ floatEquals рдХреЗ рд▓рд┐рдП - рдлреНрд▓реЛрдЯ ред (рдореИрдВрдиреЗ рдЕрд╕рдорд╛рдирддрд╛ рдСрдкрд░реЗрдЯрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдХрд╣рд╛ рд╣реИ; рдПрдХ рд╣реА рд╡рд┐рдЪрд╛рд░ рд╣реИред) рдмрд╕ рдЗрддрдирд╛ рд╣реАред рдЕрдм рд╣рдо рдкреВрд░реНрдгрд╛рдВрдХ рдФрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреА рдПрдХ рджреВрд╕рд░реЗ рд╕реЗ рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП == рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред рдпрд╛ рдХрд┐рд╕реА рднреА рд╡рд╕реНрддреБ рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдХреЗрд╡рд▓ рдИрдХ рдкреНрд░рдХрд╛рд░ рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЙрдкрдпреБрдХреНрдд рдЙрджрд╛рд╣рд░рдг рд╣реЛрдЧрд╛ ред рдФрд░ рдпрд╣ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред
рдЗрд╕ рдмреАрдЪ, рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ == рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рддреБрд▓рдирд╛ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╕рдорд╛рди рд╣реЛ; рдЖрдк, Int , рдФрд░ Float рдХреА рддреБрд▓рдирд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ редрд╣рдо рдФрд░ рдЖрдЧреЗ рдмрдврд╝реЗрдВред
рдореИрдВ рд╡рд╣реА рджреЛрд╣рд░рд╛рддрд╛ рд╣реВрдВ рдЬреЛ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдХрд╣рд╛ рд╣реИ: рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рд╕рднреА рдореЛрдирдбрд░реНрд╕ рдЯрд╛рдЗрдк рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╣реИрдВ, рдФрд░ рд╣рдордиреЗ рджрд┐рдЦрд╛рдпрд╛ рд╣реИ рдХрд┐ рд╕рднреА рдореЛрдирдбреНрд╕ >> = рдСрдкрд░реЗрдЯрд░ рдФрд░ рд░рд┐рдЯрд░реНрди рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдПрдХ рд╕реНрд╡рддрдВрддреНрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ ред рдЗрди рджреЛ рд╢реЛрдзреЛрдВ рд╕реЗ, рд╣рдо рдпрд╣ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╡рд░реНрдЧ рд╣реИ (рдЬрд┐рд╕реЗ рдЖрдкрдиреЗ рдЗрд╕реЗ рд╕рд╣реА рдорд╛рдирд╛ рд╣реИ) рдореЛрдирд╛рдб , рдЬрд┐рд╕реЗ рдореВрд▓ рд░реВрдк рд╕реЗ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:рд╡рд░реНрдЧ рдореЛрдирд╛рдб m рдЬрд╣рд╛рдБ
( >> = ) :: ma -> ( a -> mb ) -> mb
return :: a - a - ma
рдж рдореЛрдирдб рдЯрд╛рдЗрдк рдХреНрд▓рд╛рд╕ рдИрдХ рд╕реЗ рдЬреНрдпрд╛рджрд╛ рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИ ред рдХреЗрд╡рд▓ рджреЛ рдлрд╝рдВрдХреНрд╢рди / рдСрдкрд░реЗрдЯрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ - рдпрд╣ рдЗрддрдиреА рдмрдбрд╝реА рдмрд╛рдд рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдпрд╣ рдЬрд╛рдирддреЗ рд╣реИрдВред рджреЛ рдХрд╛рд░реНрдпреЛрдВ / рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рд╕рдорд╛рди рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдКрдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рд╣реИред рдореЛрдирд╛рдбрдкреНрд░рдХрд╛рд░ рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рде рд╡рд┐рд╖рдорддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдИрдХ рдХреЗ рд╕рдорд╛рди рдирд╣реАрдВ рд╣реИ ред рдореЛрдирд╛рдб рдПрдХ "рдХреНрд▓рд╛рд╕ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░" рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЗрдВрд╕реНрдЯреЗрдВрд╕ ( рдПрдо рджреНрд╡рд╛рд░рд╛ рдЪрд┐рд╣реНрдирд┐рдд ) рдЯрд╛рдЗрдк рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЯрд╛рдЗрдк рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╣реИрдВ; рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рджреЗрдЦрд╛ рд╣реИ рдХрд┐ рд╕рднреА рдореЛрдирд╛рдбрд░реНрд╕ рдЯрд╛рдЗрдк рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдХреНрд▓рд╛рд╕ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╢рд╛рдпрдж рдореЛрдирд╛рдб рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ):рдЙрджрд╛рд╣рд░рдг рдореЛрдирд╛рдб рд╢рд╛рдпрдж рдЬрд╣рд╛рдБ
(( = = ) = {- рд╕рдВрд╕реНрдХрд░рдг (>> =) рд╢рд╛рдпрдж рдХреЗ рд▓рд┐рдП -}
рд╡рд╛рдкрд╕реА = {- рд╕рдВрд╕реНрдХрд░рдг рд╡рд╛рдкрд╕реА рдХреЗ рд▓рд┐рдП рд╢рд╛рдпрдж-}
рд╕рд╛рдзрд╛рд░рдг рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдФрд░ рдХрдХреНрд╖рд╛ рдХреЗ рдбрд┐рдЬрд╛рдЗрдирд░реЛрдВ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╣реА рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рдереЛрдбрд╝рд╛ рднреНрд░рдорд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдереЛрдбрд╝рд╛ рдЕрднреНрдпрд╛рд╕, рдФрд░ рд╕рдм рдХреБрдЫ рдЬрдЧрд╣ рдкрд░ рдЧрд┐рд░ рдЬрд╛рдПрдЧрд╛ред рд╢рд╛рдпрдж рдпрд╣ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╣рд╛рд╕реНрдХреЗрд▓ рдиреЗ рдЗрд╕ рд╕рдВрдХреЗрддрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛:рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░рдХреНрд▓рд╛рд╕ рдореЛрдирд╛рдб рдПрдо рдЬрд╣рд╛рдВ
(( = = ) :: ma -> ( a -> mb ) -> mb
return :: a -> ma
рдХрдиреНрд╕реНрдЯреНрд░рдХреНрдЯрд░рдЗрдиреНрд╕реНрдЯреИрдиреНрд╕ рдореЛрдирд╛рдб рд╢рд╛рдпрдж рдЬрд╣рд╛рдБ
(( = = ) = {- рдХреЗ рд╢рд╛рдпрдж рд╕рдВрд╕реНрдХрд░рдг (>> =) ) -}
рд░рд┐рдЯрд░реНрди = {- рд░рд┐рдЯрд░реНрди рдХрд╛ рд╢рд╛рдпрдж рд╕рдВрд╕реНрдХрд░рдг -}
рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╣реБрдд рд╡рд┐рд╕реНрддреГрдд рд╣реИред рдЖрдорддреМрд░ рдкрд░ рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╕рдВрджрд░реНрдн рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИредрдЕрдм рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рд▓реЗрддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдореЛрдирд╛рдб рдкреНрд░рдХрд╛рд░ рд╡рд░реНрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ редрдЙрджрд╛рд╣рд░рдг
IO рд╕рдирдж рдХреЗ рд╕рд╛рде рд╕рдмрд╕реЗ рд╕рд░рд▓ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдЯрд░реНрдорд┐рдирд▓ рд╕реЗ рдкрд╛рда рдкрдврд╝рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИ (рдЕрдВрдд рдореЗрдВ рдПрдХ рдирдИ рдкрдВрдХреНрддрд┐ рдХреЗ рд╕рд╛рде)ред рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, getLine рдФрд░ putStrLn рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ред рдЙрдирдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдпрд╛рдж рдХрд░реЗрдВ:getLine :: IO рд╕реНрдЯреНрд░рд┐рдВрдЧ
putStrLn :: рд╕реНрдЯреНрд░рд┐рдВрдЧ -> IO ( )
рдЖрдк рдЙрдирдХреЗ рд▓рд┐рдП monadic рдХрдВрдкреЛрдЬрд┐рд╢рди рдСрдкрд░реЗрдЯрд░ > => рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ , рдХреНрдпреЛрдВрдХрд┐ getLine рдореЗрдВ рдПрдХ monadic value рдХрд╛ рд░реВрдк рд╣реИ, рди рдХрд┐ рдПрдХ monadic рдлрдВрдХреНрд╢рдиред рд▓реЗрдХрд┐рди рд╣рдо рдСрдкрд░реЗрдЯрд░ рдХреЛ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ >> = :readAndPrintLine = getLine >> = putStrLn
рдпрд╣рд╛рдБ рд╣рдо getLine monadic рдорд╛рди рдХреЗ рд▓рд┐рдП putStrLn monadic рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдПрдХ ( monadic ) рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ ред рдЬрд┐рди "рдХреНрд░рд┐рдпрд╛рдУрдВ" рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣рдордиреЗ рдкрд╣рд▓реЗ рдмрд╛рдд рдХреА рдереА, рд╣рдо рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВ: getLine рдПрдХ "рдХреНрд░рд┐рдпрд╛" рд╣реИ, рдЬреЛ рдЯрд░реНрдорд┐рдирд▓ рд╕реЗ рдкрд╛рда рдХреА рдПрдХ рдкрдВрдХреНрддрд┐ рдХреЛ рдкрдврд╝рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ "рдорд╛рди" рд▓реМрдЯрд╛рддрд╛ рд╣реИ; >> = рдСрдкрд░реЗрдЯрд░ "рдЕрдирдкреИрдХ" рдХреЛ рдореЛрдирдбрд┐рдХ рдорд╛рди рд╕реЗ рджрд░реНрдЬ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдбрд╛рд▓ рджреЗрддрд╛ рд╣реИ , рдЗрд╕реЗ рдкреБрдЯреНрд░реНрд░реНрд▓рди рдХреЗ рдкрд╛рд╕ рднреЗрдЬ рджреЗрддрд╛ рд╣реИ ; putStrLn, рдмрджрд▓реЗ рдореЗрдВ, рдЗрд╕реЗ рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХреБрдЫ рднреА рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╡рд┐рдореБрджреНрд░реАрдХреГрдд рдореВрд▓реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рдЦрд╛рд▓реА () рд▓реМрдЯрддрд╛ рд╣реИ )ред рд╣рдо рдЗрд╕реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:readAndPrintLine = getLine >>= ( \s -> putStrLn s )
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕рдВрдХреЗрддрди (\ s -> putStrLn s) рдмрд┐рд▓реНрдХреБрд▓ рдкреБрдЯрд╕реНрдЯреНрд░реЙрди рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рдорд╛рди рд╣реИ, рдЬреЛ рдиреЛрдЯреЗрд╢рди (\ x -> cos x) рдХреЗ рд╕рдорд╛рди рд╣реИ , рдЬреЛ рдХрд┐ рдХреЗрд╡рд▓ cos рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдФрд░ рдХреБрдЫ рдирд╣реАрдВ рд╣реИ ред рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ рдпрд╣рд╛рдВ рдХреБрдЫ рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рдмрджрд▓рд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреИрд╕реЗ рдХреБрдЫ (рдкрд╛рда рдХреА рдПрдХ рдкрдВрдХреНрддрд┐), рдЧреЗрдЯрд▓рд╛рдЗрди рд╕реЗ рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ , рдкреБрдЯрд╕реНрдЯреНрд░рд▓ рдХреЛ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ рдореБрджреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИредрд╣рдо рдЗрд╕ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдФрд░ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рдЕрдЧрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдЗрд╕рдХреЗ рдмрджрд▓рд╛рд╡реЛрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВрдЧреЗ, рдЬреИрд╕реЗ рд╣реА рд╣рдо рдореЛрдирд╛рдб рд╡рд░реНрдЧ рдХреЗ рдЕрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░реЗрдВрдЧреЗ редрд╕рд╛рдордЧреНрд░реА
рднрд╛рдЧ 1: рдореВрд▓ рдмрд╛рддреЗрдВрднрд╛рдЧ 2: рдХрд╛рд░реНрдп >> = рдФрд░ рд╡рд╛рдкрд╕реАрднрд╛рдЧ 3: рдореЛрдирд╛рдж рдХрд╛рдиреВрдирднрд╛рдЧ 4: рд╢рд╛рдпрдж рдореЛрдирд╛рдб рдФрд░ рд╕реВрдЪреА рдореЛрдирд╛рдбрдиреЛрдЯ
{рез} рдореВрд▓ рдореЗрдВ - "рд░рдЪрдирд╛рд╢реАрд▓рддрд╛"ред{рей} рдореВрд▓ рдореЗрдВ - "рдореЗрд░реЗ рд╣рд╛рде рдзреЛрддреЗ рд╕рдордп рдореБрдЭреЗ рдХреНрд╖рдорд╛ рдХрд░реЗрдВред" - рд▓реЗрдЦрдХ рдХреА рдЙрд▓рдЭрди, рдЬреЛ рдХрд╣рд╛ рдЧрдпрд╛ рдерд╛, рд╕реЗ рдЙрд╕рдХрд╛ рдирд┐рд╖реНрдХрд╛рд╕рди рдФрд░ рдЖрддреНрдо-рдЙрддреНрдкреАрдбрд╝рди рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рддреЗ рд╣реБрдП рдПрдХ рд▓рдЧрднрдЧ рдЕрд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕реНрдерд┐рд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ред рдпрд╣рд╛рдБ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рд░реВрд╕реА рд╡рд╛рдХреНрдпрд╛рдВрд╢ "рдореИрдВ рдЕрдкрдиреЗ рд╣рд╛рдереЛрдВ рдХреЛ рдзреЛрддрд╛ рд╣реВрдВред" рд╢рдмреНрджреЛрдВ рдХреЗ рдХрд░реАрдм рдпрд╣рд╛рдВ рдЕрдиреБрдЪрд┐рдд рд╣реЛрдЧрд╛ред рдЕрдЧрд▓реЗ рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╡рд╛рдХреНрдп рд╣реИ "рдареАрдХ рд╣реИ, рдореИрдВ рд╡рд╛рдкрд╕ рдЖ рдЧрдпрд╛ рд╣реВрдВред", рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд▓реЗрдЦрдХ рдЕрдкрдиреЗ рд╣рд╛рдереЛрдВ рдХреЛ рдзреЛрдиреЗ рдХреЗ рдмрд╛рдж рд╡рд╛рдкрд╕ рдЖ рдЧрдпрд╛ред рдЕрд░реНрде рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рддред{4} рдЕрдирд╛рдо рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд╛ рджреВрд╕рд░рд╛ рдирд╛рдо: рд▓реИрдореНрдмреНрдбрд╛ рдлрд╝рдВрдХреНрд╢рдВрд╕ред{рел} рдореВрд▓ рдореЗрдВ - "рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╢реАрддрд▓рддрд╛ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдмрд┐рдВрджреБ"{рем} рдореВрд▓ рдореЗрдВ - рд╕реНрдерд┐рд░ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ "рдпрд╣ рд╕рдм рдпрд╣рд╛рдБ рд╕реЗ рдбрд╛рдЙрдирд╣рд┐рд▓ рд╣реИ"ред рдЗрд╕рдХрд╛ рдПрдХ рд╡рд┐рдбрдВрдмрдирд╛рдкреВрд░реНрдг рдЕрд░реНрде рд╣реИ, рджреЛ рд╡рд┐рдкрд░реАрддреЛрдВ рдХреЛ рдорд┐рд▓рд╛рдирд╛: 1. рдКрдВрдЪрд╛рдИ рдкрд░ рдЪрдврд╝рдирд╛, рд╡рдВрд╢ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛; 2. рдЖрдЧреЗ рдпрд╣ рдХреЗрд╡рд▓ рдЦрд░рд╛рдм рд╣реЛ рдЬрд╛рдПрдЧрд╛ред