рдПрдХ рдФрд░ рдореЛрдирд╛рдж рдЧрд╛рдЗрдб (рднрд╛рдЧ 3: рдореЛрдирд╛рдж рдХрд╛рдиреВрди)

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

рдкрд┐рдЫрд▓реЗ рдПрдХ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВрдиреЗ рдореЛрдирд╛рдб рдкреНрд░рдХрд╛рд░ рд╡рд░реНрдЧ рдХреЗ рджреЛ рдмреБрдирд┐рдпрд╛рджреА рдореЛрдиреИрдбрд┐рдХ рдСрдкрд░реЗрд╢рдиреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреА: рдмрд╛рдЗрдВрдб рдСрдкрд░реЗрдЯрд░ (рдмрд╛рдЗрдВрдб, >> = ) рдФрд░ рд░рд┐рдЯрд░реНрди рдлрд╝рдВрдХреНрд╢рдиред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рдореЛрдирд╛рдб рдкреНрд░рдХрд╛рд░ рд╡рд░реНрдЧ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░реВрдВрдЧрд╛ рдФрд░ рдореЛрдирд╛рдж рдХрд╛рдиреВрдиреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ред

рдлреБрд▓ рдореЛрдирд╛рдб рдЯрд╛рдЗрдк рдХреНрд▓рд╛рд╕


рдЖрдЗрдП рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓рддреЗ рд╣реИрдВ рдкреВрд░реА рдореЛрдирд╛рдж рдЯрд╛рдЗрдк рдХреНрд▓рд╛рд╕ рдкрд░рд┐рднрд╛рд╖рд╛ рдкрд░:

рд╡рд░реНрдЧ рдореЛрдирд╛рдб рдЬрд╣рд╛рдВ
( >> = ) :: рдПрдо рдП -> ( рдП -> рдПрдо рдмреА ) -> рдПрдо рдмреА
рд╡рд╛рдкрд╕реА :: 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: рд╢рд╛рдпрдж рдореЛрдирд╛рдб рдФрд░ рд╕реВрдЪреА рдореЛрдирд╛рдб

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


All Articles