рдорд╛рдЗрдХ рд╡рдирд┐рдпрд░ рджреНрд╡рд╛рд░рд╛
рдкрд┐рдЫрд▓реЗ рдПрдХ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВрдиреЗ
рдореЛрдирд╛рдб рдкреНрд░рдХрд╛рд░ рд╡рд░реНрдЧ рдХреЗ рджреЛ рдмреБрдирд┐рдпрд╛рджреА рдореЛрдиреИрдбрд┐рдХ рдСрдкрд░реЗрд╢рдиреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреА: рдмрд╛рдЗрдВрдб рдСрдкрд░реЗрдЯрд░ (рдмрд╛рдЗрдВрдб,
>> = ) рдФрд░
рд░рд┐рдЯрд░реНрди рдлрд╝рдВрдХреНрд╢рдиред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ
рдореЛрдирд╛рдб рдкреНрд░рдХрд╛рд░ рд╡рд░реНрдЧ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░реВрдВрдЧрд╛ рдФрд░
рдореЛрдирд╛рдж рдХрд╛рдиреВрдиреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ред
рдлреБрд▓ рдореЛрдирд╛рдб рдЯрд╛рдЗрдк рдХреНрд▓рд╛рд╕
рдЖрдЗрдП рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓рддреЗ рд╣реИрдВ рдкреВрд░реА
рдореЛрдирд╛рдж рдЯрд╛рдЗрдк рдХреНрд▓рд╛рд╕ рдкрд░рд┐рднрд╛рд╖рд╛ рдкрд░:
рд╡рд░реНрдЧ рдореЛрдирд╛рдб рдЬрд╣рд╛рдВ
( >> = ) :: рдПрдо рдП -> ( рдП -> рдПрдо рдмреА ) -> рдПрдо рдмреА
рд╡рд╛рдкрд╕реА :: a -> m a
( >> ) :: рдПрдо рдП -> рдПрдо рдмреА -> рдПрдо рдмреА
рд╡рд┐рдлрд▓ :: рд╕реНрдЯреНрд░рд┐рдВрдЧ -> рдПрдо рдП
рд╣рдо рдкрд░рд┐рдЪрд┐рдд рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ:
>> = рдСрдкрд░реЗрдЯрд░ рдФрд░ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде
рд╡рд╛рдкрд╕реА рдлрд╝рдВрдХреНрд╢рди, рд▓реЗрдХрд┐рди рдЙрдирдХреЗ рдЕрд▓рд╛рд╡рд╛
>> рдСрдкрд░реЗрдЯрд░ рдФрд░
рдЕрд╕рдлрд▓ рдлрд╝рдВрдХреНрд╢рди рднреА рд╣реИред рдЙрдирдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ?
рдлреЗрд▓ рдлрдВрдХреНрд╢рди рд╢реБрд░реВ рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдмрд╣реБрдд рд╣реА рдкреНрд░рдореБрдЦ рддрд░реАрдХрд╛ рд╣реИред рдпрд╣ рддрдм рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм
>> = рдСрдкрд░реЗрдЯрд░ рдорд┐рд▓рд╛рди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдХрд╛рд░рдг
a -> mb рдкреНрд░рдХрд╛рд░ рдХреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдорд╛рди рдмрд╛рдБрдз рдирд╣реАрдВ рд╕рдХрддрд╛ рд╣реИред рдореИрдВ рдЕрдм рдЗрд╕ рддрдВрддреНрд░ рдХреЗ рд╡рд┐рд╡рд░рдг рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдирд╛ рдЪрд╛рд╣рддрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЙрдмрд╛рдК рд╣реИ; рдпрджрд┐ рдЖрдкрдХреЛ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддреЛ Haskell
рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ рдкреНрд░рд▓реЗрдЦрди рджреЗрдЦреЗрдВред рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ,
рдЕрд╕рдлрд▓рддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред
>> рдСрдкрд░реЗрдЯрд░ рдереЛрдбрд╝рд╛ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред рдЙрд╕рдХрд╛ рдпрд╣ рдкреНрд░рдХрд╛рд░ рд╣реИ:
( >> ) :: рдПрдо рдП -> рдПрдо рдмреА -> рдПрдо рдмреА
рдпрд╣ рдСрдкрд░реЗрдЯрд░ рдПрдХ рдореЛрдирдбрд┐рдХ рдЕрдиреБрдХреНрд░рдо рдСрдкрд░реЗрдЯрд░ рд╣реИред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдпрд╣ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдореЛрдирдбрд┐рдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди (
>> = рдпрд╛ "рдмрд╛рдЗрдВрдб") рд╣реИ, рдЬреЛ рдЯрд╛рдЗрдк
mb рдХреЗ "рдПрдХреНрд╢рди" рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЯрд╛рдЗрдк рдХреЗ рдЕрдирдкреИрдХреНрдб рд╡реИрд▓реНрдпреВ рдХреЛ рдЕрд▓рдЧ рдХрд░рддрд╛ рд╣реИред рдЗрд╕реЗ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
mv1 >> mv2 = mv1 >> = ( \ _ -> mv2 )
рд╣рдо рдпрд╣рд╛рдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐
рдорд╛рдирджрд┐рдХ рдорд╛рди
mv1 рд╕реЗ рдЕрдирдкреИрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдХреЛрдИ рднреА рдорд╛рди рдЦрд╛рд░рд┐рдЬ рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЕрдВрддрд┐рдо
рдорд╛рдирдж рдорд╛рди
mv2 рд▓реМрдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ред рдСрдкрд░реЗрдЯрд░ рддрдм рдЙрдкрдпреЛрдЧреА рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЕрдирдкреИрдХреНрдб рд╡реИрд▓реНрдпреВ рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╣реЛрддрд╛ рд╣реИ
() , рдпрд╛рдиреА рдпрд╣ рдПрдХ рдЦрд╛рд▓реА рдкреНрд░рдХрд╛рд░ рд╣реИред
PutStrLn рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЙрджрд╛рд╣рд░рдг рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
putStrLn :: рд╕реНрдЯреНрд░рд┐рдВрдЧ -> IO ( )
рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдЖрдк рджреЛ рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдПрдХ рдХреЗ рдмрд╛рдж рдПрдХ, рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рдмрд╛рдж рд▓рд╛рдЗрди рдЯреВрдЯрдиреЗ рдХреЗ рд╕рд╛рдеред рдЖрдк рдпрд╣ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
putStrLn "рдпрд╣ рд╕реНрдЯреНрд░рд┐рдВрдЧ 1 рд╣реИред" >> putStrLn "рдпрд╣ рд╕реНрдЯреНрд░рд┐рдВрдЧ 2 рд╣реИред"
рдФрд░ рдпрд╣ рдХрд╛рдо рдХреНрдпреЛрдВ рдХрд░рддрд╛ рд╣реИ? рдЖрдЗрдП рджреЗрдЦреЗрдВ рдкреНрд░рдХрд╛рд░:
( putStrLn "This is string 1." ) :: IO ( )
( putStrLn "This is string 2." ) :: IO ( )
рдпрд╣реА рд╣реИ,
>> рдСрдкрд░реЗрдЯрд░ рдкреНрд░рдХрд╛рд░
IO () рдХреЗ рджреЛ рдПрдХрд╛рддреНрдордХ рдорд╛рдиреЛрдВ рдХреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ
IO () рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдорд╛рдирджрд┐рдХ рдорд╛рди рд╕реЗ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдЪрд▓реЛ
>> рдСрдкрд░реЗрдЯрд░ рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдХрд░рддреЗ рд╣реИрдВ:
( >> ) :: рдПрдо рдП -> рдПрдо рдмреА -> рдПрдо рдмреА
рдпрджрд┐
рдореА IO рд╣реИ , рдФрд░
a рдФрд░
b рд╣реИрдВ
() , рддреЛ рд╣рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ:
( >> ) :: IO ( ) -> IO ( ) -> IO ( )
рд▓рд┐рдЦрдХрд░, рд╣рдо рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐, рд╢рд╛рдпрдж,
>> рдСрдкрд░реЗрдЯрд░ рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рджреЛ "рдХреНрд░рд┐рдпрд╛рдПрдВ" рдХрд░рддрд╛ рд╣реИ - рдПрдХ рдкрдВрдХреНрддрд┐ рдкреНрд░рд┐рдВрдЯ рдХрд░рдирд╛ред
рдЕрдм рдПрдХ рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдЙрджрд╛рд╣рд░рдгред рд╣рдореЗрдВ рдЯрд░реНрдорд┐рдирд▓ рд╕реЗ рдкрд╛рда рдХреА рдПрдХ рдкрдВрдХреНрддрд┐ рдХреЛ рдкрдврд╝рдиреЗ рдФрд░ рдЗрд╕реЗ рджреЛ рдмрд╛рд░ рдкреНрд░рд┐рдВрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рдо рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
readAndPrintLineTwice :: IO ( )
readAndPrintLineTwice = getLine >> = ( \ s -> ( putStrLn s >> putStrLn s )
рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛рдУрдВ рдХреЗ рдХрд╛рд░рдг, рд░рд┐рдХреЙрд░реНрдб рдХреЛ рдХреЛрд╖реНрдардХ рдХреЗ рдмрд┐рдирд╛ рдЫреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
readAndPrintLineTwice :: IO ( )
readAndPrintLineTwice = getLine >> = \ s -> putStrLn s >> putStrLn s
рддреЛ рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ?
getLine -
monadic value ("рдХрд╛рд░реНрд░рд╡рд╛рдИ"), рдЬреЛ рдЯрд░реНрдорд┐рдирд▓ рд╕реЗ рдкрд╛рда рдХреА рдПрдХ рдкрдВрдХреНрддрд┐ рдкрдврд╝рддреА рд╣реИред
>> = рдСрдкрд░реЗрдЯрд░ "рдПрдХ рдореЛрдирдбрд┐рдХ рдореВрд▓реНрдп рд╕реЗ рдЗрд╕" рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдЕрдирдкреИрдХ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ
s рдирд╛рдо рд╕реЗ
рдЬреЛрдбрд╝рддрд╛ рд╣реИ (рдХреНрдпреЛрдВрдХрд┐
\ s -> putStrLn s >> putStrLn s рдПрдХ
рдореЛрдиреИрдбрд┐рдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ,
>> = рдСрдкрд░реЗрдЯрд░ рдХрд╛ рджреВрд╕рд░рд╛ рддрд░реНрдХ)ред рдлрд┐рд░
s рдирд╛рдордХ рд▓рд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ
monadic value
putStrLn s >> putStrLn s рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЗрд╕реЗ рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░ рдореЗрдВ рджреЛ рдмрд╛рд░ рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИред
рдпрджрд┐ рдЖрдк рдЬреЛ рдХрд╣рддреЗ рд╣реИрдВ рд╡рд╣ рд░рд╣рд╕реНрдпрдкреВрд░реНрдг рд▓рдЧрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЖрдкрдХреА рдЧрд▓рддреА рдирд╣реАрдВ рд╣реИред рдпрд╣рд╛рдБ рдЧрд╣рд░рд╛рдИ рдореЗрдВ рдХреБрдЫ рдЕрдЬреАрдм рд╣реЛ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рддрдХ рдореИрдВрдиреЗ рд░рд╛рдЬреНрдп рдХреЗ рдорда рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдирд╣реАрдВ рдХреА, рдореИрдВ рдЗрд╕реЗ рдирд╣реАрдВ рд╕рдордЭрд╛ рд╕рдХрддрд╛ред рд▓реЗрдХрд┐рди рдЕрдм рдЖрдкрдХреЛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП
рдХрд┐ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдЖрдк рдЕрднреА рднреА рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдордЭ рдирд╣реАрдВ рдкрд╛ рд░рд╣реЗ рд╣реЛрдВ
рдХрд┐ рдпрд╣
рдХреИрд╕реЗ рд╣реЛрддрд╛ рд╣реИред
рдЕрднреА рдореИрдВ рдереЛрдбрд╝рд╛ рдкреАрдЫреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдореЛрдирд╛рдж рдХрд╛рдиреВрдиреЛрдВ рдХреЛ рджреЗрдЦрддрд╛ рд╣реВрдВред рд╡реЗ
>> = рдСрдкрд░реЗрдЯрд░ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рд╢реЗрд╖ рдореЛрдирдб рдХреЗ рд▓рд┐рдП
рд░рд┐рдЯрд░реНрди рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдПрдХ рдмрдбрд╝реА рднреВрдорд┐рдХрд╛ рдирд┐рднрд╛рддреЗ рд╣реИрдВред рдЙрд╕рдХреЗ рдмрд╛рдж рд╣рдо рдФрд░ рдЕрдзрд┐рдХ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╕рд╛рдордЧреНрд░рд┐рдпреЛрдВ рдХреА рдУрд░ рд░реБрдЦ рдХрд░реЗрдВрдЧреЗред
рддреАрди рдХрд╛рдиреВрдирд╡рд╛рдж рдХреЗ
рдХрдИ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрд╛рдиреВрди рддреАрди рдХреЗ рд╕рдореВрд╣реЛрдВ рдореЗрдВ рдЪрд▓рддреЗ рд╣реИрдВ: рдиреНрдпреВрдЯрди рдХреЗ рддреАрди рдпрд╛рдВрддреНрд░рд┐рдХ рдХрд╛рдиреВрди, рдКрд╖реНрдордкреНрд░рд╡реИрдЧрд┐рдХреА рдХреЗ рддреАрди рдХрд╛рдиреВрди, рдЕрдЬреАрдореЛрд╡ рд░реЛрдмреЛрдЯрд┐рдХреНрд╕ рдХреЗ рддреАрди рдХрд╛рдиреВрди, рдЧреНрд░рд╣реЛрдВ рдХреА рдЧрддрд┐ рдХреЗ рддреАрди рдХреЗрдкрд▓рд░ рдХрд╛рдиреВрди, рдФрд░ рдЗрд╕реА рддрд░рд╣ред рдЗрд╕рдореЗрдВ рдореЛрдирдбреНрд╕ рднрд┐рдиреНрди рдирд╣реАрдВ рд╣реИрдВ, рдареАрдХ рд╣реИ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЗрд╕ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде рдХрд┐ "рддреАрди рдореЛрдирд╛рдб рдХрд╛рдиреВрди" рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВред ;-)
>> = рдСрдкрд░реЗрдЯрд░ рдФрд░
рд░рд┐рдЯрд░реНрди рдлрд╝рдВрдХреНрд╢рди рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдореЛрдирд╛рдб рдХреЗ рд▓рд┐рдП рдорд╛рдиреНрдп рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрдирдХреЗ рдкрд╛рд╕ рдЙрд╕ рдореЛрдирд╛рдб рдХреЗ рд▓рд┐рдП рд╕рд╣реА рдкреНрд░рдХрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкрд░рд┐рднрд╛рд╖рд╛рдПрдБ
= = рдФрд░
рд╢рд╛рдпрдж рдореЛрдирдб рдХреЗ рд▓рд┐рдП рд╡рд╛рдкрд╕реА рдЗрд╕рдХреЗ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
( >> = ) :: рд╢рд╛рдпрдж a -> ( a -> рд╢рд╛рдпрдж b ) -> рд╢рд╛рдпрдж b
рд╡рд╛рдкрд╕реА :: a -> рд╢рд╛рдпрдж a
рдФрд░ рднрд┐рдХреНрд╖реБрдУрдВ рдХреЗ рд▓рд┐рдП,
IO рдкреНрд░рдХрд╛рд░
IO рд╣реЛрддреЗ рд╣реИрдВ:
( >> = ) :: IO a -> ( a -> IO b ) -> IO b
рд╡рд╛рдкрд╕реА :: a -> IO b
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИред рдЗрди рдХрд╛рд░реНрдпреЛрдВ / рд╕рдВрдЪрд╛рд▓рдХреЛрдВ рдХреЛ рддреАрди "рдореЛрдирдб рдХрд╛рдиреВрдиреЛрдВ" рдХреЛ рдкреВрд░рд╛ рдХрд░рдирд╛ рднреА рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдореЛрдирд╛рдб рдХрд╛рдиреВрди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИрдВ; рд╡реЗ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЧрдП рд╣реИрдВ рдХрд┐ рдореЛрдиреИрдбрд┐рдХ рд░рдЪрдирд╛ рдЕрдиреБрдорд╛рдирд┐рдд рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИред рдкрд╣рд▓реЗ рдореИрдВ рдЖрдкрдХреЛ рдореЛрдирд╛рдж рдХрд╛рдиреВрдиреЛрдВ рдХрд╛ рдПрдХ "рдЕрдЪреНрдЫрд╛" рд╕рдВрд╕реНрдХрд░рдг рджреВрдВрдЧрд╛, рдФрд░ рдлрд┐рд░ рдореИрдВ (рдмрджрд╕реВрд░рдд) рд░рд╛рд╕реНрддрд╛ рджрд┐рдЦрд╛рдКрдВрдЧрд╛, рдЬреИрд╕рд╛ рдХрд┐ рд╡реЗ рдЖрдорддреМрд░ рдкрд░ рд╡рд░реНрдгрд┐рдд рд╣реИрдВред (рдореБрдЭреЗ рдзрдиреНрдпрд╡рд╛рдж рдХрд╣реЗрдВ: "рдЕрдЪреНрдЫрд╛" рд╡рд┐рдХрд▓реНрдк рд╕рдордЭрдиреЗ рдореЗрдВ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред)
рдЕрдЪреНрдЫрд╛ рд╕рдВрд╕реНрдХрд░рдг рд╣реИ
рдпрд╣рд╛рдВ рдореЛрдиреИрдбрд┐рдХ рд░рдЪрдирд╛ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╡реНрдпрдХреНрдд рдХрд┐рдП рдЧрдП рддреАрди рд╡рд┐рд╡рд╛рджрд╛рд╕реНрдкрдж рдХрд╛рдиреВрдиреЛрдВ рдХреА рдПрдХ рдЕрдЪреНрдЫреА рдкрд░рд┐рднрд╛рд╖рд╛ рд╣реИ (рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдСрдкрд░реЗрдЯрд░
(> =>) рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдПрдХ рд░рд╛рдХреНрд╖рд╕реА рдСрдкрд░реЗрдЯрд░ рд╣реИ):
рез ред рд╡рд╛рдкрд╕реА > => рдПрдл == рдПрдл
реи ред f > => рд╡рд╛рдкрд╕реА == f
рей ред ( f > => g ) > => h == f > => ( g > = = h )
рдпреЗ рдХрд╛рдиреВрди рд╣рдореЗрдВ рдХреНрдпрд╛ рдмрддрд╛ рд░рд╣реЗ рд╣реИрдВ?
рдХрд╛рдиреВрди 1 рдФрд░ 2 рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛
рд╡рд╛рдкрд╕реА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП: рдпрд╣ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдореЛрдиреИрдбрд┐рдХ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП рдЗрдХрд╛рдИ (рддрдЯрд╕реНрде рддрддреНрд╡) рд╣реИ (рдкрд╣рд▓рд╛ рдирд┐рдпрдо рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рд╡рд╛рдкрд╕реА рдмрд╛рдИрдВ рдЗрдХрд╛рдИ рд╣реИ, рдФрд░ рджреВрд╕рд░реА рдпрд╣ рдХрд┐ рджрд╛рдПрдВ)ред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, monadic function
f рдФрд░
рд▓реМрдЯрдиреЗ (рдХрд┐рд╕реА рднреА рдХреНрд░рдо рдореЗрдВ) рдХреА рд░рдЪрдирд╛ рдХрд░рдиреЗ рд╕реЗ рдлрдВрдХреНрд╢рди
f рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддрд╛ рд╣реИ ред рдПрдирд╛рд▓реЙрдЧреНрд╕ рдХреЛ 0 рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - рдкреВрд░реНрдгрд╛рдВрдХ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдПрдХ рддрдЯрд╕реНрде рддрддреНрд╡, рдФрд░ 1 - рдкреВрд░реНрдгрд╛рдВрдХ рдЧреБрдгрди рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рддрдЯрд╕реНрде рддрддреНрд╡; рдкреНрд░рддреНрдпреЗрдХ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рдВрдмрдВрдзрд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рдореВрд▓реНрдп рд╕реЗ рдЬреБрдбрд╝рд╛ рддрдЯрд╕реНрде рддрддреНрд╡ рдмрд╕ рдЗрд╕ рдорд╛рди рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдЧрд╛ред
рдирд┐рдпрдо 3 рдореЗрдВ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рд░рдЪрдирд╛ рдХрд╛ рдореМрджреНрд░рд┐рдХ рдХрд╛рд░реНрдп рд╕рд╛рд╣рдЪрд░реНрдп рд╣реИ: рдЬрдм рд╣рдо рддреАрди рдорд╛рдирд╕ рд╕рдВрдмрдВрдзреА рдХрд╛рд░реНрдпреЛрдВ (
f ,
g ,
h ) рдХреЛ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рд╣рдо рдкрд╣рд▓реЗ рдХреМрди рд╕реЗ рджреЛ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИ рдХрд┐ рдкреВрд░реНрдгрд╛рдВрдХреЛрдВ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрдиреЗ рдкрд░ рдЬреЛрдбрд╝ рдФрд░ рдЧреБрдгрди рднреА рд╕рд╣рдпреЛрдЧреА рд╣реЛрддреЗ рд╣реИрдВред
рдХреНрдпрд╛ рдпреЗ рдХрд╛рдиреВрди рдЖрдкрдХреЛ рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд▓рдЧрддреЗ рд╣реИрдВ? рдЖрдЗрдП рд╣рдо рд╕рдВрдмрдВрдзрд┐рдд "рдХрд╛рдиреВрдиреЛрдВ" рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ, рдЬреЛ рд░рдЪрдирд╛ рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдп рд╕реЗ рд╕рдВрддреБрд╖реНрдЯ рд╣реИрдВ:
рез ред рдЖрдИрдбреАред рдЪ == рдЪ
реи ред рдЪ ред рдЖрдИрдбреА == рдПрдл
рей ред ( f ред g ) рдЬ == рдЪ ред ( рдЬреА ред рдПрдЪ ред )
рдЬрд╣рд╛рдВ
рдЖрдИрдбреА рдПрдХ рддрдЯрд╕реНрде рддрддреНрд╡, рдЗрдХрд╛рдИ рд╣реИред рдХреНрдпрд╛ рдЖрдкрдиреЗ рд╕рдорд╛рдирддрд╛ рдХреЛ рдкрдХрдбрд╝ рд▓рд┐рдпрд╛? рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреА рд╕рдВрд░рдЪрдирд╛ рдмрд╛рдИрдВ рдпрд╛ рджрд╛рдИрдВ рдУрд░ рдПрдХ рдЗрдХрд╛рдИ рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдлрд┐рд░ рд╕реЗ рджреЗрдЧреА, рдФрд░ рд░рдЪрдирд╛ рдлрд╝рдВрдХреНрд╢рди рд╕рд╛рд╣рдЪрд░реНрдп рд╣реИред рд░рдЪрдирд╛ рдХрд╛ рд░рд╛рдХреНрд╖рд╕реА рдХрд╛рд░реНрдп рд╕рд╛рд╣рдЪрд░реНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░
рд▓реМрдЯрдирд╛ рдПрдХ рдПрдХрд▓ рдХрд╛рд░реНрдп рдХреЗ рдмрд░рд╛рдмрд░ рдорд╛рдирджрдгреНрдб рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рддрд╛рдХрд┐ рдорд╛рдирдж рд░рдЪрдирд╛ рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдПрдХ рдирд┐рдпрдорд┐рдд рд░рдЪрдирд╛ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдкреВрд░реНрд╡рд╛рдиреБрдорд╛рдирд┐рдд рд╣реЛред
рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдЗрди рдХрд╛рдиреВрдиреЛрдВ рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ? рдЪреВрдБрдХрд┐ рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рд╕рдВрдиреНрдпрд╛рд╕реА рдмреБрджреНрдзрд┐рдорд╛рдиреА рд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░реЗрдВ, рд╣рдорд╛рд░реА
рд╡рд╛рдкрд╕реА рдХреА рдкрд░рд┐рднрд╛рд╖рд╛рдПрдБ рдФрд░
>> = рдЗрди рдХрд╛рдиреВрдиреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рдо рдЬрд▓реНрдж рд╣реА рд╕реАрдЦреЗрдВрдЧреЗ рдХрд┐ рдХреИрд╕реЗ
>> = рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░реЗрдВ рдФрд░
рд╡рд╛рдкрд╕ рд▓реМрдЯреЗрдВ ред [рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐
>>>> рдСрдкрд░реЗрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдореЛрдиреИрдбрд┐рдХ рдХрд╛рдиреВрдиреЛрдВ рдХреЛ рд╡реНрдпрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рди рдХрд┐
>> = рдСрдкрд░реЗрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ, рд▓реЗрдХрд┐рди рд╣рдо рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рджреЗрдЦреЗрдВрдЧреЗ
= , рдпрд╣ рд╕рдордХрдХреНрд╖ рд╣реИред]
рд╣рд╛рд▓рд╛рдВрдХрд┐ , рдПрдХ рдкрдХрдбрд╝ рд╣реИ: рд╣рд╛рд╕реНрдХреЗрд▓ рдореЛрдирд╛рдб рдХрд╛рдиреВрдиреЛрдВ рдХреА рдЬрд╛рдВрдЪ
рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ ! рдЬрд╛рдБрдЪ рдХреА рдПрдХрдорд╛рддреНрд░ рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐
рд╡рд╛рдкрд╕реА рдФрд░
>> = рдкрд░рд┐рднрд╛рд╖рд╛ рдкреНрд░рдХрд╛рд░ рд╕рд╣реА рд╣реИрдВред рдХрд╛рдиреВрди рд▓рд╛рдЧреВ рд╣реЛ рд░рд╣реЗ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВ, рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдЬрд╛рдВрдЪ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред
рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧ рдкреВрдЫрддреЗ рд╣реИрдВ, "рд╣рд╛рд╕реНрдХреЗрд▓ рдореМрджреНрд░рд┐рдХ рдХрд╛рдиреВрдиреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХреНрдпреЛрдВ
рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ ?" рдЬрд╡рд╛рдм рдЖрд╕рд╛рди рд╣реИ: рд╣рд╛рд╕реНрдХреЗрд▓ рдЕрднреА рддрдХ рдкрд░реНрдпрд╛рдкреНрдд рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдирд╣реАрдВ рд╣реИ! рдПрдХ рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рднрд╛рд╖рд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛ рдХрд┐ рдореЛрдирдб рдХрд╛рдиреВрдиреЛрдВ рдХреА рд╢реБрджреНрдзрддрд╛ рдХреЛ рд╕рд╛рдмрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЖрдкрдХреЛ рдПрдХ рдкреНрд░рдореЗрдп рдХрд╣рд╛рд╡рдд (рддреЗрд╡рд░рдо рдкреНрд░реЛрд╡рд░) рдХреА рддрд░рд╣ рдХреБрдЫ рдЪрд╛рд╣рд┐рдПред рдкреНрд░рдореЗрдпреЛрдВ рдХреЗ рдкреНрд░рдорд╛рдг рд▓реБрднрд╛рд╡рдиреЗ рд╣реИрдВ, рдФрд░ рд╡реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд╛ рднрд╡рд┐рд╖реНрдп рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╡реЗ рдкрд╛рд░рдВрдкрд░рд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИрдВред рдпрджрд┐ рдЖрдк рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдХреВрдХ рдкреНрд░рдореЗрдпреЛрдВ рдХрд╛ рдПрдХ рд╕рдореНрдорд╛рдирд┐рдд рдкреНрд░рдорд╛рдг рд╣реИ, рдпрд╣
рдпрд╣рд╛рдВ рдЙрдкрд▓рдмреНрдз
рд╣реИ ред рд▓реЗрдХрд┐рди рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ, рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдпрд╣ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЙрд╕рдиреЗ рдЬреЛ рдореЛрдирд╛рдб рд▓рд┐рдЦрд╛ рд╣реИ рд╡рд╣ рдореЛрдирд╛рдб рдХрд╛рдиреВрдиреЛрдВ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рдмрджрд╕реВрд░рдд рд╕рдВрд╕реНрдХрд░рдг
рдЕрдЪреНрдЫреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐
> => рдСрдкрд░реЗрдЯрд░ рдХреЛ
рдореЛрдирд╛рдб рдкреНрд░рдХрд╛рд░ рдХреА рдХрдХреНрд╖рд╛ рдореЗрдВ рд╕реАрдзреЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ; рдЗрд╕рдХреЗ рдмрдЬрд╛рдп,
>> = рдСрдкрд░реЗрдЯрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░
> = = рдСрдкрд░реЗрдЯрд░ рдЗрд╕реЗ рд╕реЗ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдКрдкрд░ рджрд┐рдЦрд╛рдпрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдЕрдЧрд░ рд╣рдо рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреЛ
>> >> рддрдХ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ рдФрд░ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ
рд╡рд╛рдкрд╕ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ , рддреЛ рд╣рдореЗрдВ рдХреЗрд╡рд▓
рд╡рд╛рдкрд╕реА рдФрд░
>> = рдпреБрдХреНрдд рд╡рд┐рд╡рд╛рджрд╛рд╕реНрдкрдж рдХрд╛рдиреВрдиреЛрдВ рдХреА рдЬрд░реВрд░рдд рд╣реИред рдФрд░ рдЗрд╕ рд░реВрдк рдореЗрдВ рд╡реЗ рдкрд┐рдЫрд▓реЗ рдЦрдВрдб рдореЗрдВ рджрд┐рдЦрд╛рдП рдЧрдП рд╕реЗ рдХрдо рд╕рд╣рдЬ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рд╡рдЬреВрдж, рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХрд┐рддрд╛рдмреЛрдВ рдФрд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рдкрд░реЛрд╕реЗ рдЬрд╛рддреЗ рд╣реИрдВред
>> = рдСрдкрд░реЗрдЯрд░ рдФрд░
рд░рд┐рдЯрд░реНрди рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдореЛрдирдб рдХрд╛рдиреВрди рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреЗ рд╣реИрдВ:
рез ред рд╡рд╛рдкрд╕реА x >> = f == f x
реи ред mv >> = рд╡рд╛рдкрд╕реА == mv
рей ред ( mv >> = f ) >> = g == mv >> = ( \ x -> ( f x >> = g ) )
рдЬрд╣рд╛рдВ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдореВрд▓реНрдп рд╣реИрдВ:
mv :: m a
рдПрдл :: рдП -> рдПрдо рдмреА
g :: b -> m c
рдХреБрдЫ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП
рдП ,
рдмреА ,
рд╕реА рдФрд░ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рдореЛрдирд╛рдб
рдПрдо ред
рдПрдХ рдЕрдЪреНрдЫреЗ рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рдореЛрдирд╛рдж рдХрд╛рдиреВрдиреЛрдВ рдХреЗ рдПрдХ рдмрджрд╕реВрд░рдд рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛
рдЪрд▓реЛ рдордЬрд╝реЗ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рдЕрдЪреНрдЫреЗ рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рдореЛрдирдб рдХрд╛рдиреВрдиреЛрдВ рдХреЗ рдПрдХ рдмрджрд╕реВрд░рдд рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВред рд╣рдорд╛рд░реА рдЧрдгрдирд╛ рдореЗрдВ, рд╣рдореЗрдВ рдорд╛рдирд╕рд┐рдХ рд░рдЪрдирд╛ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреА рд╣рдордиреЗ рдКрдкрд░ рдЬрд╛рдВрдЪ рдХреА рдереА:
f > => g = \ x -> ( f x >> = g )
рдирд┐рдпрдо 1:
рд╡рд╛рдкрд╕реА > => рдПрдл == рдПрдл
\ x -> ( рд╡рд╛рдкрд╕реА x >> = f ) == \ x -> f x
рд╡рд╛рдкрд╕реА x >> = f == f x - QED ("рдЬреИрд╕рд╛ рд╕рд╛рдмрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ")
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐
\ x -> fx рдХреЗрд╡рд▓
f рдХреЗ рд╕рдорд╛рди рд╣реИред
рдирд┐рдпрдо 2:
f> => рд╡рд╛рдкрд╕реА == f
\ x -> (fx >> = рд╡рд╛рдкрд╕реА) == \ x -> fx
fx >> = рд╡рд╛рдкрд╕реА == fx
let mv == fx
mv >> = рд╡рд╛рдкрд╕реА == mv - QED
рдирд┐рдпрдо 3:
( f > => g ) > => h == f > => ( g > = = h )
\ x -> ( ( f > => g ) x >> = h ) == \ x -> ( f x >> = = ( g > = = h ) )
( f > = = g ) x >> = h == f x >> = ( g > = = h )
(( y y -> ( f y >> = g ) ) x >> = h == f x >> = ( \ y -> ( g y >> = h ) )
- рдЧрдгрдирд╛ (\ y -> (f y >> = g)) x рд╣рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ: (f x >> = g)
( f x >> = g ) >> = h == f x >> = ( \ y -> ( g y >> = h ) )
- mv = f x рдХрд░реЗрдВ, рдлрд┐рд░:
( mv >> = g ) >> = h == mv >> = ( \ y -> ( g y >> = h ) )
- g рд╕реЗ f, h рдХреЛ g рд╕реЗ рдмрджрд▓реЗрдВ:
( mv >> = f ) >> = g == mv >> = ( \ y -> ( f y >> = g ) )
- y рдХреЛ рд╕рд╣реА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ x рд╕реЗ рдмрджрд▓реЗрдВ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ:
( mv >> = f ) >> = g == mv >> = ( \ x -> ( f x >> = g ) )
рдЧрдгрдирд╛ рдЪрд░рдг
(\ y -> (fy >> = g)) x рдореЗрдВ, рд╣рдо рдмрд╕ рдкреВрд░реЗ рдлрд╝рдВрдХреНрд╢рди (
\ y -> ... ) рдХреЛ рддрд░реНрдХ
x рдкрд░ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ ; рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ,
y рдХреЛ рдлрд╝рдВрдХреНрд╢рди рдмреЙрдбреА рдореЗрдВ рд╡реЗрд░рд┐рдПрдмрд▓
x рджреНрд╡рд╛рд░рд╛ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдпрд╣ рджреАрд░реНрдШрд╡реГрддреНрдд (...) рджреНрд╡рд╛рд░рд╛ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ), рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдмреЙрдбреА рдХреЛ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рд▓реМрдЯрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓рд┐рдВрдЧреЛ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдореЗрдВ, рдЗрд╕ рдСрдкрд░реЗрд╢рди рдХреЛ
рдмреАрдЯрд╛ рдХрдореА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред {1: рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдЧрдгрд┐рдд рдХреЗ рдПрдХ рдЦрдВрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рд▓реИрдореНрдмреНрдбрд╛ рдХреИрд▓рдХреБрд▓рд╕ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ, рдмреАрдЯрд╛ рдХрдореАред} рдмреАрдЯрд╛ рдХрдореА рдХрд╛рд░реНрдпреЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХрд╛ рдореБрдЦреНрдп рддрд░реАрдХрд╛ рд╣реИред рдЕрдВрддрд┐рдо рдЪрд░рдг, рдЬрд╣рд╛рдВ
y рдХреЛ
x рд╕реЗ рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╕рд╣реА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджреЛ рдХрд╛рд░реНрдп рд╕рд╣реА рд╣реИрдВ:
\ x -> f x
\ y -> рдЪ y
- рдпрд╣ рдПрдХ рдФрд░ рдПрдХ рд╣реА рд╣реИ (рдФрдкрдЪрд╛рд░рд┐рдХ рддрд░реНрдХ рдХрд╛ рдирд╛рдо рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛)ред рд▓рд┐рдВрдЧреЛ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рднрд╛рд╖рд╛ рдореЗрдВ, рд╣рдо рдХрд╣реЗрдВрдЧреЗ рдХрд┐ рджреЛ рдХрд╛рд░реНрдп
рдЕрд▓реНрдлрд╛ рд╕рдорддреБрд▓реНрдп рд╣реИрдВ ред рдЖрдк рдЕрдиреНрдп рдЪрд░рдгреЛрдВ рдХреЛ рд╕рдордЭ рдЧрдП рд╣реЛрдВрдЧреЗред
рдХреНрдпрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ?
рдореЛрдирд╛рдж рдХрд╛рдиреВрдиреЛрдВ рдХреЛ рдХрднреА-рдХрднреА рдХреЛрдб рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдПрдХ рдЫреЛрдЯреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рд▓рдВрдмреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреА рдЬрдЧрд╣ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
рд░рд┐рдЯрд░реНрди рдПрдХреНрд╕ = = рдПрдл рдХреЗ рдмрдЬрд╛рдп
, рдЖрдк рдмрд╕
рдПрдлрдПрдХреНрд╕ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ)ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓реЗрдЦреЛрдВ рдореЗрдВ рджрд┐рдЦрд╛рдПрдВрдЧреЗ рдХрд┐ рдореЛрдирд╛рдж рдХрд╛рдиреВрдиреЛрдВ рдХрд╛ рдореБрдЦреНрдп рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рд╡реЗ рд╣рдореЗрдВ рд╡рд┐рд╢рд┐рд╖реНрдЯ рднрд┐рдХреНрд╖реБрдУрдВ рдХреЗ рд▓рд┐рдП
рд╡рд╛рдкрд╕реА рдФрд░
>> = рдХреА рдкрд░рд┐рднрд╛рд╖рд╛рдПрдБ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред
рдЗрд╕ рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ, рдореИрдВ рдЖрдкрдХреЛ рд▓реЗрдЦрди рдХрд╛ рдПрдХ рд╕рд╛рдл-рд╕реБрдерд░рд╛ рд╡рд╛рдХреНрдп-рд╡рд┐рдиреНрдпрд╛рд╕ рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЬрд┐рд╕рдХреА рдорджрдж рд╕реЗ рд╡рд┐рд╡рд╛рджрд╛рд╕реНрдкрдж рдХреЛрдб рдмрд╣реБрдд рдЕрдЪреНрдЫреЗ рд▓рдЧрддреЗ рд╣реИрдВред
рдХрд░реЛ- рдЕрдореВрд░реНрдд
рдпрд╛рдж
рд░рдЦреЗрдВ рд░реАрдбрдСрдкрдкреНрд░рд┐рдВрдЯрд▓рд╛рдЗрдирд╡рд╛рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдКрдкрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
readAndPrintLineTwice :: IO ( )
readAndPrintLineTwice = getLine >> = \ s -> putStrLn s >> putStrLn s
рдЙрд╕рдХрд╛ рдПрдХ рдлрд╛рдпрджрд╛ рд╣реИ: рдпрд╣ рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред рдиреБрдХрд╕рд╛рди рджреБрдирд┐рдпрд╛ рдореЗрдВ рд╕рдмрд╕реЗ рдкрдардиреАрдп рд░реЗрдЦрд╛ рдирд╣реАрдВ рд╣реИред рд╣рд╛рд╕реНрдХреЗрд▓ рдбрд┐рдЬрд╛рдЗрдирд░реЛрдВ рдиреЗ рджреЗрдЦрд╛ рдХрд┐ рдореЛрдирдбрд┐рдХ рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреЛ рдкрдврд╝рдирд╛ рдЕрдХреНрд╕рд░ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рд╡реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЪреНрдЫреА рд╡рд╛рдХреНрдпрд╛рддреНрдордХ рдЪреАрдиреА рдХреЗ рд╕рд╛рде рдЖрддреЗ рд╣реИрдВ рдЬреЛ рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреЛ рдЕрдзрд┐рдХ рдкрдардиреАрдп рдмрдирд╛рддрд╛ рд╣реИред
рдЗрд╕ рд╕рд┐рдВрдЯреИрдХреНрдЯрд┐рдХ рд╢реБрдЧрд░ рдХрд╛ рдЖрдзрд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ рдореЛрдирд╛рдбрд┐рдХ рдХреЛрдб рдореЗрдВ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдСрдкрд░реЗрд╢рди рджреЛ рд░реВрдкреЛрдВ рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВ:
- рдСрдирд▓рд╛рдЗрди рдлреЙрд░реНрдоред
- рдПрдорд╡реА :: рдПрдо рдП
- f :: a -> m b
mv >> = \ x -> mf x
- рдлреЙрд░реНрдоред
- рдПрдорд╡реА :: рдПрдо рдП
- рдПрдорд╡реА 2 :: рдПрдо рдмреА
mv >> mv2
рдЗрди рджреЛрдиреЛрдВ рд░реВрдкреЛрдВ рдХреЛ рдкрдардиреАрдп рдмрдирд╛рдиреЗ рдХреЗ рдЗрд░рд╛рджреЗ рд╕реЗ рдиреЛрдЯреЗрд╢рди рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрд╣
do рдХреАрд╡рд░реНрдб рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдмрд╛рдж рдХреБрдЫ рдореЛрдиреИрдбрд┐рдХ рдСрдкрд░реЗрд╢рди рд╣реЛрддреЗ рд╣реИрдВред рддреЛ рд╣рдорд╛рд░реЗ рдпреЗ рджреЛ рдЙрджрд╛рд╣рд░рдг
do -notation рдореЗрдВ рд▓рд┐рдЦреЗ рдЬрд╛рдПрдВрдЧреЗ:
- рдлреЙрд░реНрдо, рдбреВ-рдиреЛрдЯреЗрд╢рдиред
do v <- mv
рдПрдл рд╡реА
- рдлреЙрд░реНрдо 2, рдбреВ-рдиреЛрдЯреЗрд╢рдиред
рдПрдо.рд╡реА.
mv2
рдлреЙрд░реНрдо 1 рдореЗрдВ, рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдо рдПрдХ рдорд╛рдирджрд╛рд░ рдорд╛рди
mv рдФрд░ "рдЕрдирдкреИрдХ" рд▓реЗрддреЗ рд╣реИрдВ, рдЗрд╕реЗ рдПрдХ рдирд┐рдпрдорд┐рдд
v рдореЗрдВ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рджреВрд╕рд░реА рдкрдВрдХреНрддрд┐ рд╕рд┐рд░реНрдл
v рд╕реЗ
f рдХреА рдЧрдгрдирд╛ рдХрд░ рд░рд╣реА рд╣реИред рд╕реНрдЯреНрд░рд┐рдВрдЧ
fv рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╕рдВрдкреВрд░реНрдг рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИред
рдлреЙрд░реНрдо 2 рдореЗрдВ, рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдореЗрдВ рдореМрджреНрд░рд┐рдХ рдорд╛рди ("рдПрдХреНрд╢рди")
mv "рдирд┐рд╖реНрдкрд╛рджрд┐рдд" рд╣реЛрддрд╛ рд╣реИред рджреВрд╕рд░реА рдкрдВрдХреНрддрд┐ "рдЕрдиреНрдп рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдореВрд▓реНрдп" (рдХрд╛рд░реНрд░рд╡рд╛рдИ) "
mv2 "
рдЪрд▓рд╛рддрд╛ рд╣реИ ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╕рдВрдХреЗрддрди рд╣реИ рдЬреЛ
mv рдФрд░
mv2 рдХреЛ рдПрдХ рдЕрдиреБрдХреНрд░рдо рдореЗрдВ
рдмрджрд▓рддрд╛ рд╣реИ , рдЬреИрд╕рд╛ рдХрд┐
>> рдСрдкрд░реЗрдЯрд░ рдХрд░рддрд╛ рд╣реИред
рд╣рд╛рд╕реНрдХреЗрд▓ рдХрдВрдкрд╛рдЗрд▓рд░ рдлреЙрд░реНрдо 1 рдФрд░ рдлреЙрд░реНрдо 2 рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ
рдбреВ- рдиреЛрдЯреЗрд╢рди рдХреЛ рдзрд░реНрдорд╛рдиреНрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд░реВрдкрд╛рдВрддрд░рдг рд╣реИ, рдФрд░ рджреЛрдиреЛрдВ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдХрд╛ рдЕрд░реНрде рд╕рдорд╛рди рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рджреЛрдиреЛрдВ рд░реВрдкреЛрдВ рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрдХреЗрддрди рдХреА рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ рдорд┐рд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдПрдХ рдЙрджрд╛рд╣рд░рдг:
- рдПрдорд╡реА :: рдПрдо рдП
- v1 :: рдП
- f :: a -> m b
- рд╡реА 2 :: рдмреА
- рдПрдорд╡реА 3 :: рдПрдо рд╕реА
рдХрд░рдирд╛
v1 <- рдПрдо.рд╡реА.
v2 <- f v1
mv3
рд╡рд╛рдкрд╕реА v2
рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рд╡реИрд╕рд╛ рд╣реА рд╣реИ:
mv >> = ( \ v1 ->
( f v1 >> = ( \ v2 ->)
( mv3 >>
( рд╡рд╛рдкрд╕реА v2 ) ) ) ) ))
рдпрд╛ рдмрд┐рдирд╛ рд╕реНрдХреЛрдХрдмреЛрдХ:
mv >> = \ v1 ->
f v1 >> = \ v2 ->
mv3 >> рд╡рд╛рдкрд╕реА v2
рдЖрдк рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЬрдм рдЙрдиреНрдорд╛рджреА рднрд╛рд╡ рдмрдврд╝рддреЗ рд╣реИрдВ,
рддреЛ рдбреВ -рдлреЙрд░реНрдо рдкрдврд╝рдиреЗ рдореЗрдВ рдЙрддрдирд╛ рд╣реА рдЖрд╕рд╛рди рд░рд╣рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдмрд┐рдирд╛ рдХрд┐рдП рдлреЙрд░реНрдо (рдЬрд┐рд╕реЗ "рд╕реБрдЧрдВрдзрд┐рдд" рднреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ) рдЕрдХреНрд╕рд░ рдЕрдкрдардиреАрдп рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣реА рдХрд╛рд░рдг
рд╣реИ рдХрд┐ рдЕрдореВрд░реНрдд рдореМрдЬреВрдж рд╣реИред рдпрд╣ рдорд╣рд╛рди рд╣реИ рдХрд┐
рд╕рднреА рд╕рд╛рдзреБрдУрдВ рдХреЗ рд▓рд┐рдП рд╕рд╛рд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдХреЗрд╡рд▓ рдПрдХ рдирд╣реАрдВред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдк рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ рдбреВ-рдиреЛрдЯреЗрд╢рди рдФрд░ рд╢реБрдЧрд░рд▓реЗрд╕ рдиреЛрдЯреЗрд╢рди рдХреЛ рдорд┐рд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рддрд░рд╣:
рдХрд░рдирд╛ v1 <- рдПрдо.рд╡реА.
v2 <- f v1
mv3 >> рд╡рд╛рдкрд╕реА v2
рдпрд╣ рдХрднреА-рдХрднреА рдЙрдкрдпреЛрдЧреА рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдХреНрд╕рд░ рдЦрд░рд╛рдм рдХреЛрдб рдкрдардиреАрдпрддрд╛ рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддрд╛ рд╣реИред
рдЖрдЗрдП рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдХреИрд╕реЗ
рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
- рд▓рд╛рдЗрди рдкрдврд╝реЗрдВ, рдлрд┐рд░ рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдВред
readAndPrintLine :: IO ( )
readAndPrintLine =
рдХрд░рдирд╛
рд▓рд╛рдЗрди <- getLine
putStrLn рд▓рд╛рдЗрди
- рд╣рдо рджреЛ рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдПрдХ рдХреЗ рдмрд╛рдж рдПрдХред
- рдХреЛрдИ рдлрд╝рдВрдХреНрд╢рди рдирд╣реАрдВред
рдХрд░рдирд╛
putStrLn "рдпрд╣ рд╕реНрдЯреНрд░рд┐рдВрдЧ 1 рд╣реИред"
putStrLn "рдпрд╣ рд╕реНрдЯреНрд░рд┐рдВрдЧ 2 рд╣реИред"
- рд▓рд╛рдЗрди рдкрдврд╝реЗрдВ рдФрд░ рджреЛ рдмрд╛рд░ рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдВред
readAndPrintLineTwice :: IO ( )
readAndPrintLineTwice =
рдХрд░рдирд╛
рд▓рд╛рдЗрди <- getLine
putStrLn рд▓рд╛рдЗрди
putStrLn рд▓рд╛рдЗрди
рдпрд╣рд╛рдВ, рдХреЛрдб рдХреЛ рдЯреВ-рдиреЛрдЯреЗрд╢рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж рдкрдврд╝рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред рджрд┐рд▓рдЪрд╕реНрдк рд░реВрдк рд╕реЗ, рдЗрд╕рдХрд╛ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд▓рд╛рдн (рдпрд╛ рдиреБрдХрд╕рд╛рди рд╣реИ, рдЬрд┐рд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЖрдк рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ): рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рдХреЛрдб рдЕрдирд┐рд╡рд╛рд░реНрдп рджрд┐рдЦрддрд╛ рд╣реИ! рдпрджрд┐ рд╣рдо рдКрдкрд░ рд╕реЗ рдиреАрдЪреЗ рддрдХ рдХреЛрдб рдкрдврд╝рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдПрдХ рдЕрдирд┐рд╡рд╛рд░реНрдп рднрд╛рд╖рд╛ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ, рдЬреЛ рддреАрд░ рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп
<- ред рдорд╛рди рд▓реЗрдВ рдХрд┐
readAndPrintLine рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: тАЬрдЬрд┐рд╕ рд▓рд╛рдЗрди рдХреЛ рд╣рдо
рд▓рд╛рдЗрди рдЪрд░ рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВ, рдЙрд╕реЗ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП
рдЧреЗрдЯрд▓рд╛рдЗрди рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ; рддрдм рд╣рдо рдЗрд╕ рдЪрд░ рдХреЛ рдкреНрд░рд┐рдВрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
рдкреБрд╕реНрдЯрд░реНрди рдХрд╣рддреЗ рд╣реИрдВред "рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
рд░реЗрдЦрд╛ рдЪрд░ рдирд╣реАрдВ рд╣реИ), рд▓реЗрдХрд┐рди рдЖрдк рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХреЛрдб рдЬреЛ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЗрдирдкреБрдЯ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдХреЗ рд▓рд┐рдП
do- abstract рд▓рд┐рдЦрдирд╛ рдмрд╣реБрдд рд╣реА рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХрд╛ рд╣реИред
рдиреЛрдЯреЗрд╢рди рдХреЗ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧреА рдЧреБрдг рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк
do -notations рдХреЗ рд╢рд░реАрд░ рдореЗрдВ рд▓реЗрдЯ-рдПрдХреНрд╕рдкреНрд░реЗрд╢рдВрд╕ рдФрд░ рдХреЗрд╕-рдПрдХреНрд╕рдкреНрд░реЗрд╢рди рдПрдореНрдмреЗрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдЕрдХреНрд╕рд░ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛрддрд╛ рд╣реИред рдореИрдВ рд╡рд┐рд╡рд░рдг рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдКрдВрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рджрд┐рдирдЪрд░реНрдпрд╛ рд╣реИ - рдЗрд╕ рдмрд┐рдВрджреБ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдЕрдиреНрдп рд╣рд╛рд╕реНрдХреЗрд▓ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреЛ рд▓реЗрдВред
рдЕрдЧрд▓реА рдмрд╛рд░
рдЕрдЧрд▓реЗ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ
рд╢рд╛рдпрдж рдореЛрдирдбреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреВрдВрдЧрд╛,
рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╢реБрд░реБрдЖрдд (рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдореЛрдирд╛рдж рдЬрд┐рд╕рдореЗрдВ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реЛ рд╕рдХрддреА рд╣реИ) рдФрд░ рд╕реВрдЪреА рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ рдореЛрдирд╛рдб (рдХрдИ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП)ред
рд╕рд╛рдордЧреНрд░реА
рднрд╛рдЧ 1: рдореВрд▓ рдмрд╛рддреЗрдВрднрд╛рдЧ 2: рдХрд╛рд░реНрдп >> = рдФрд░ рд╡рд╛рдкрд╕реАрднрд╛рдЧ 3: рдореЛрдирд╛рдж рдХрд╛рдиреВрдирднрд╛рдЧ 4: рд╢рд╛рдпрдж рдореЛрдирд╛рдб рдФрд░ рд╕реВрдЪреА рдореЛрдирд╛рдб