рдХрд╛рдВрдЯреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣рд╛рд╕реНрдХреЗрд▓ (рдЕрдиреБрд╡рд╛рдж)ред 2/2



рдЕрдиреБрд╡рд╛рдж рдХрд╛ рджреВрд╕рд░рд╛ рднрд╛рдЧ рд╣рд╛рд╕реНрдХреЗрд▓ рдХрд╛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдФрд░ рдХрдард┐рди рдкрд░рд┐рдЪрдп рд╣реИред рдкрд╣рд▓реЗ рд╡рд╛рд▓рд╛ рдпрд╣рд╛рдБ рдЙрдкрд▓рдмреНрдз рд╣реИред

рдпрд╣рд╛рдВ рдореВрд▓



рдзрд┐рдХреНрдХрд╛рд░ рд╣реИ рдХрдард┐рди рд╣рд┐рд╕реНрд╕рд╛



рдмрдзрд╛рдИ! рддреБрдо рд╕рдЪ рдореЗрдВ рдмрд╣реБрдд рджреВрд░ рд╣реЛ рдЧрдПред
рдФрд░ рдЕрдм рдХрдЪрд░рд╛, рдЕрдкрд╢рд┐рд╖реНрдЯ рдФрд░ рд╕реЛрдбреЛрдореА рд╢реБрд░реВ рд╣реЛ рдЬрд╛рдПрдЧрд╛ :)ред

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



рддреИрдпрд╛рд░ рд╣реЛ рдЬрд╛рдУ, рдЬрд╡рд╛рдм рд╕рдмрд╕реЗ рд╕рд░рд▓ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
рд▓реЗрдХрд┐рди рдЙрдирдХреЗ рд▓рд╛рдн рдирд┐рд░реНрд╡рд┐рд╡рд╛рдж рд╣реЛрдВрдЧреЗред



03_рд╣реЗрд▓ / 01_IO / 01_progressive_io_example.lhs


рдЖрдИрдУ рд╕реЗ рдирд┐рдкрдЯрдирд╛



tl; рдбреЙрдЖрд░ :

рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдп рдЬреЛ IO рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓рдЧрднрдЧ рдПрдХ рдЕрдирд┐рд╡рд╛рд░реНрдп рдХрд╛рд░реНрдпрдХреНрд░рдо рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:

 f :: IO a f = do x <- action1 action2 x y <- action3 action4 xy 

  • рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдорд╛рди рдЕрд╕рд╛рдЗрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо <- рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
  • рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдкреНрд░рдХрд╛рд░ IO * ;
    • action1 :: IO b
    • action2 x :: IO ()
    • action3 :: IO c
    • action4 xy :: IO a
    • x :: b , y :: c

  • рдХрдИ рдСрдмреНрдЬреЗрдХреНрдЯ рдкреНрд░рдХрд╛рд░ IO a ред
    рдРрд╕реА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдЖрдк рд╢реБрджреНрдз рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред
    рд╢реБрджреНрдз рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ action2 (purefunction x) ред



рдЗрд╕ рдЦрдВрдб рдореЗрдВ рдореИрдВ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдХрд┐ IO рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдирд╣реАрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рд╣рд╛рд╕реНрдХреЗрд▓ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд╕реНрд╡рдЪреНрдЫ рднрд╛рдЧреЛрдВ рдХреЛ рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯреНрд╕ рд╕реЗ рдЕрд▓рдЧ рдХреИрд╕реЗ рдХрд░рддрд╛ рд╣реИред

рдпрджрд┐ рд╡рд╛рдХреНрдп-рд╡рд┐рдиреНрдпрд╛рд╕ рдХрд╛ рдХреЛрдИ рд╡рд┐рд╡рд░рдг рдереЛрдбрд╝рд╛ рд╕рд╛ рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИ, рддреЛ рд░реЛрдХреЗрдВ рдирд╣реАрдВред
рд╣рдо рдЕрдЧрд▓реЗ рднрд╛рдЧ рдореЗрдВ рдЙрдирдХреЗ рдкрд╛рд╕ рд▓реМрдЯреЗрдВрдЧреЗред

рд╣рдо рдХреНрдпрд╛ рдкрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ?

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред рдЙрдирдХреА рд░рд╛рд╢рд┐ рдкреНрд░рд┐рдВрдЯ рдХрд░реЗрдВ


 toList :: String -> [Integer] toList input = read ("[" ++ input ++ "]") main = do putStrLn "   ( ):" input <- getLine print $ sum (toList input) 


рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рд▓реЗрдХрд┐рди рдЪрд▓реЛ рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдХрд░реАрдм рд╕реЗ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВред
 putStrLn :: String -> IO () getLine :: IO String print :: Show a => a -> IO () 


рдХреНрдпрд╛ рдЖрдкрдиреЗ рджреЗрдЦрд╛ рд╣реИ рдХрд┐ do block рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ IO a рдкреНрд░рдХрд╛рд░ рдХреА IO a ?

 main = do putStrLn " ... " :: IO () getLine :: IO String print Something :: IO () 


<- рдЪрд░рд┐рддреНрд░ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдкрд░ рднреА рдзреНрдпрд╛рди рджреЗрдВред

 do x <- something 


рдЕрдЧрд░ something :: IO a , рддреЛ x :: a ред

IO рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдзреНрдпрд╛рди рджреЗрдВред рджреЛ-рдмреНрд▓реЙрдХ рдореЗрдВ рд╕рднреА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рджреЛ рддрд░реАрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:

 action1 :: IO a --      a = () 

рдпрд╛
 value <- action2 --  -- bar zt :: IO b -- value :: b 


рдпреЗ рджреЛ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпрд╛рдБ рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИрдВред рдЖрдкрдХреЛ рдЕрдЧрд▓реЗ рднрд╛рдЧ рдХреЗ рдЕрдВрдд рддрдХ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреВрд░реА рдЬрд╛рдирдХрд╛рд░реА рд╣реЛ рдЬрд╛рдПрдЧреАред

03_рд╣реЗрд▓ / 01_IO / 01_progressive_io_example.lhs



03_рд╣реЗрд▓ / 01_IO / 02_progressive_io_example.lhs

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

  % runghc 02_progressive_io_example.lhs Enter a list of numbers (separated by comma): foo Prelude.read: no parse 


Arrrgghhhh! рд╢реИрддрд╛рдиреА рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдФрд░ рдХрд╛рд░реНрдпрдХреНрд░рдо рджреБрд░реНрдШрдЯрдирд╛!
рдлрд┐рд░ рд╣рдореЗрдВ рдкрд╣рд▓рд╛ рдХрджрдо рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдкрдврд╝рдиреЗ рдореЗрдВ рдЖрд╕рд╛рди рд╣реЛред

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдпрд╣ рд╕рдордЭрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреБрдЫ рдЧрд▓рдд рд╣реБрдЖред
рдПрдХ рддрд░реАрдХрд╛ Maybe рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред
рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдХреНрд╕рд░ рд╣рд╛рд╕реНрдХреЗрд▓ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

 import Data.Maybe 

рдпрд╣ рдХреНрдпрд╛ рдЪреАрдЬ рд╣реИ? Maybe рдпрд╣ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬреЛ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рд▓реЗрддрд╛ рд╣реИред рдпрд╣рд╛рдБ рдЙрд╕рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рд╣реИ:
 data Maybe a = Nothing | Just a 


рдпрд╣ рд╕рдордЭрдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдХреЛрдИ рдорд╛рди рдмрдирд╛рдиреЗ рдпрд╛ рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╕рдордп рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реБрдИ рд╣реИред
maybeRead ' maybeRead рдлрд╝рдВрдХреНрд╢рди рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдПрдХ рдмрдбрд╝рд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИред
рдпрд╣ рдлрд╝рдВрдХреНрд╢рди read рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рдорд╛рди рд╣реИ (рдЬреЛ рдХрд┐ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлрд╝рдВрдХреНрд╢рди eval рд╕рдорд╛рди рд╣реИ, рдЬреЛ JSON рд╕реНрдЯреНрд░рд┐рдВрдЧ, рдХреЛ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░рддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдХреБрдЫ рдЧрд▓рдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдкрд░рд┐рдгрд╛рдо Nothing рд╣реЛрдЧрд╛ред
рдФрд░ рдпрджрд┐ рдкрд░рд┐рдгрд╛рдо рд╕рд╣реА рд╣реИ, рддреЛ рдпрд╣ Just <> рд▓реМрдЯреЗрдЧрд╛ред
рдЗрд╕ рдлреАрдЪрд░ рдореЗрдВ рдЧрд╣рд░рд╛рдИ рд╕реЗ рдЙрддрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рди рдХрд░реЗрдВред
рдЗрд╕рдореЗрдВ рдХреЛрдб read рддреБрд▓рдирд╛ рдореЗрдВ рдХрдо рд╣реИ; ред

 maybeRead :: Read a => String -> Maybe a maybeRead s = case reads s of [(x,"")] -> Just x _ -> Nothing 


рдЕрдм рдЬрдм рдХреЛрдб рдЕрдзрд┐рдХ рдкрдардиреАрдп рд╣реЛ рдЧрдпрд╛ рд╣реИ, рд╣рдо рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦреЗрдВрдЧреЗ рдЬреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ:
рдпрджрд┐ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдЧрд▓рдд рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдЖрдпрд╛, рддреЛ рдпрд╣ Nothing рд▓реМрдЯрд╛рдПрдЧрд╛ред
рдЕрдиреНрдп рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, "1,2,3" рдХреЗ рд▓рд┐рдП, рдпрд╣ Just [1,2,3] рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧреАред

 getListFromString :: String -> Maybe [Integer] getListFromString str = maybeRead $ "[" ++ str ++ "]" 


рдЕрдм рдореБрдЦреНрдп рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рдорд╛рд░реЗ рдХреЛрдб рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВред

 main :: IO () main = do putStrLn "  ,  :" input <- getLine let maybeList = getListFromString input in case maybeList of Just l -> print (sum l) Nothing -> error "  . ." 


рддреНрд░реБрдЯрд┐ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдПрдХ рдЕрдЪреНрдЫрд╛ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВред

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореБрдЦреНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЗ do-block рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдкреНрд░рдХрд╛рд░ IO a рдХреЗ рд░реВрдк рдореЗрдВ рд░рд╣рддрд╛ IO a ред
рдХреЗрд╡рд▓ рдЕрдЬреАрдм рдЪреАрдЬ error ред
error msg рдлрд╝рдВрдХреНрд╢рди рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЗрдирдкреБрдЯ ( IO () рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ) рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред

рдПрдХ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ - рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реИрдВред
рдХреЗрд╡рд▓ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ, рдкреНрд░рдХрд╛рд░ IO рд╕рд╛рде рдФрд░ рдпрд╣: main ред
рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдореБрдЦреНрдп рдПрдХ рд╢реБрджреНрдз рдХрд╛рд░реНрдп рдирд╣реАрдВ рд╣реИред
рд▓реЗрдХрд┐рди рдпрд╣ рд╢реБрджреНрдз getListFromString рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
рдХреЗрд╡рд▓ рдШреЛрд╖рд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рджреЗрдЦрдХрд░, рд╣рдо рджреБрд╖реНрдкреНрд░рднрд╛рд╡реЛрдВ рд╕реЗ рд╢реБрджреНрдз рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рд╢реБрджреНрдз рдХрд╛рд░реНрдп рдХреНрдпреЛрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВ?
рдореИрдВ рдХреБрдЫ рдЪреАрдЬреЗрдВ рднреВрд▓ рд╕рдХрддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рддреАрди рдореБрдЦреНрдп рдХрд╛рд░рдг рд╣реИрдВ:



рдЗрди рдХрд╛рд░рдгреЛрдВ рд╕реЗ, рдЖрдкрдХреЛ рд╕реНрд╡рдЪреНрдЫ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдпрдерд╛рд╕рдВрднрд╡ рдЕрдзрд┐рдХ рдХреЛрдб рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред

03_рд╣реЗрд▓ / 01_IO / 02_progressive_io_example.lhs



03_Hell / 01_IO / 03_progressive_io_example.lhs

рдЕрдЧрд▓рд╛ рдХрджрдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд▓рдЧрд╛рддрд╛рд░ рд╕рд░реНрд╡реЗрдХреНрд╖рдг рдХрд░рдирд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рд╡рд╣ рд╕рд╣реА рдЙрддреНрддрд░ рдирд╣реАрдВ рджреЗрддрд╛ред

рдкрд╣рд▓рд╛ рднрд╛рдЧ рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд░рд╣реЗрдЧрд╛:
 import Data.Maybe maybeRead :: Read a => String -> Maybe a maybeRead s = case reads s of [(x,"")] -> Just x _ -> Nothing getListFromString :: String -> Maybe [Integer] getListFromString str = maybeRead $ "[" ++ str ++ "]" 


рдФрд░ рдЕрдм рд╣рдо рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦреЗрдВрдЧреЗ рдЬреЛ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреА рд╕реВрдЪреА рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИ, рдФрд░ рддрдм рддрдХ рдмрд╛рд╣рд░ рдирд╣реАрдВ рдирд┐рдХрд▓рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдЙрд╕реЗ рдЗрдирдкреБрдЯ рд╡реИрдз рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рди рд╣реЛред

 askUser :: IO [Integer] askUser = do putStrLn "  ,  :" input <- getLine let maybeList = getListFromString input in case maybeList of Just l -> return l Nothing -> askUser 


рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкреНрд░рдХрд╛рд░ IO [Integer] ред
рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдореЗрдВ IO рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ [Integer] рдЬреИрд╕рд╛ рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓рд╛ред
рдХреБрдЫ рд▓реЛрдЧ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╕рдордЭрд╛рддреЗ рд╣реИрдВ:

"рдпрд╣ [Integer] IO рдЕрдВрджрд░ рд╣реИ"


рдпрджрд┐ рдЖрдк I / O рддрдВрддреНрд░ рдХреА рдЖрдВрддрд░рд┐рдХ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рд╕рдордЭрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЕрдЧрд▓реЗ рднрд╛рдЧ рдХреЛ рдкрдврд╝реЗрдВред
рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрджрд┐ рдЖрдк IO рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдмрд╕ рдХреБрдЫ рд╕рд░рд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦреЗрдВ рдФрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдирд╛ рди рднреВрд▓реЗрдВред

рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдорд╛рд░рд╛ рдореБрдЦреНрдп рдХрд╛рд░реНрдп рдмрд╣реБрдд рд╕рд░рд▓ рд╣реЛ рдЧрдпрд╛:

 main :: IO () main = do list <- askUser print $ sum list 


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



рдереЛрдбрд╝рд╛ рдЕрднреНрдпрд╛рд╕, рдФрд░ IO рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрдкрдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред

рд╡реНрдпрд╛рдпрд╛рдо :

  • рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рд▓рд┐рдЦреЗрдВ рдЬреЛ рдЖрдкрдХреЗ рд╕рднреА рддрд░реНрдХреЛрдВ рдХреЛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░реЗред рд╕рдВрдХреЗрдд: getArgs рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред



03_Hell / 01_IO / 03_progressive_io_example.lhs


IO рдЪрд╛рд▓ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг



tl; рдбреЙрдЖрд░ :

рд╢реБрджреНрдз рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдЕрдВрддрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП,
main рдХреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк main рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬреЛ рджреБрдирд┐рдпрд╛ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрджрд▓рддрд╛ рд╣реИ
 main :: World -> World 

рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯ рд╣реЛрдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рд╣реИред рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдореБрдЦреНрдп рдХрд╛рд░реНрдп рдХреЛ рджреЗрдЦреЗрдВ:

 main w0 = let (v1,w1) = action1 w0 in let (v2,w2) = action2 v1 w1 in let (v3,w3) = action3 v2 w2 in action4 v3 w3 

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдХрдИ рд╕рдордп рдорд╛рди рд╣реИрдВ ( w1 , w2 рдФрд░ w3 )
рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдЧрд▓реЗ рдЪрд░рдг рдореЗрдВ рдбреЗрдЯрд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╣рдо рдПрдХ bind рдпрд╛ (>>=) рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВред bind рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж bind рд╣рдореЗрдВ рдЕрдм рдЕрд╕реНрдерд╛рдпреА рдореВрд▓реНрдпреЛрдВ рдХреЗ рдирд╛рдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

  main = action1 >>= action2 >>= action3 >>= action4 


рдмреЛрдирд╕: рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╕рд┐рдВрдЯреЗрдХреНрд╕ рдЪреАрдиреА рд╣реИ:
  main = do v1 <- action1 v2 <- action2 v1 v3 <- action3 v2 action4 v3 



рд╣рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЕрдЬреАрдм рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ, рдФрд░ IO рдХрд╛ рдкреНрд░рдХрд╛рд░ рдХреНрдпрд╛ рд╣реИ? рдЬрдмрдХрд┐ рдпрд╣ рд╕рдм рдХреБрдЫ рдЬрд╛рджреВ рд╕рд╛ рд▓рдЧрддрд╛ рд╣реИред

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

 askUser :: IO [Integer] askUser = do putStrLn "  ,  :" input <- getLine let maybeList = getListFromString input in case maybeList of Just l -> return l Nothing -> askUser main :: IO () main = do list <- askUser print $ sum list 


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

рд▓реЗрдХрд┐рди рдЖрдкрдиреЗ рд╢рд╛рдпрдж рдЧреМрд░ рдХрд┐рдпрд╛ рдХрд┐ рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдХреБрдЫ рдЕрд╕рд╛рдорд╛рдиреНрдп рд╣реИред рддреЛ рд╣рдореЗрдВ рдХрд╛рд░рдгреЛрдВ рдХрд╛ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдг рдорд┐рд▓рд╛ред

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

рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ, рджреБрдирд┐рдпрд╛ рдХреА рд╕реНрдерд┐рддрд┐ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реИред рд╣рдо рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ main рдХрд╛рд░реНрдп рджреБрдирд┐рдпрд╛ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИред рдФрд░ рдЗрд╕рдХрд╛ рдкреНрд░рдХрд╛рд░ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:

 main :: World -> World 


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

рд╣рд╛рд╕реНрдХреЗрд▓ рдХрд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рджреБрдирд┐рдпрд╛ main рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдирдкреБрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИред
рд▓реЗрдХрд┐рди рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рдХрд╛рд░ рдЕрдзрд┐рдХ рдкрд╕рдВрдж рд╣реИ

 main :: World -> ((),World) 


(рдЬреЛ рд▓реЛрдЧ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рдЙрдирдХреЗ рд▓рд┐рдП рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдкреНрд░рдХрд╛рд░ data IO a = IO {unIO :: State# RealWorld -> (# State# RealWorld, a #)} ред рд╕рднреА # рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВ, рдФрд░ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдореИрдВрдиреЗ рдХрдИ рдлрд╝реАрд▓реНрдб рдирд┐рдЧрд▓ рд▓рд┐рдП рд╣реИрдВред рд▓реЗрдХрд┐рди рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░, рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдмрджрд▓рд╛ рд╣реИред)


рдкреНрд░рдХрд╛рд░ () рдПрдХ рдЦрд╛рд▓реА рдкреНрд░рдХрд╛рд░ рд╣реИред
рдЦрд╛рд▓реАрдкрдиред

рдЪрд▓реЛ рд╣рдорд╛рд░реЗ рд╕рдорд╛рд░реЛрд╣ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛, рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреВрд▓ рдирд╣реАрдВ:
 main w0 = let (list,w1) = askUser w0 in let (x,w2) = print (sum list,w1) in x 


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯ рд╡рд╛рд▓реЗ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдкреНрд░рдХрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:

 World -> (a,World) 


рдЬрд╣рд╛рдВ a рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, getChar рдлрд╝рдВрдХреНрд╢рди World -> (Char,World) рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП World -> (Char,World) ред

рдПрдХ рдФрд░ рдЧреИрд░-рд╕реНрдкрд╖реНрдЯ рдЪреАрдЬ рд╡рд╣ рдХреНрд░рдо рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИред
рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ, рдпрджрд┐ рдЖрдк fab рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХрдИ рд╡рд┐рдХрд▓реНрдк рд╣реЛрдВрдЧреЗ:



рдЪреВрдВрдХрд┐ рднрд╛рд╖рд╛ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рд╢реБрджреНрдз рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХреА рдЪрд╛рд▓реЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╣реИрдВред

рдпрджрд┐ рдЖрдк рдЕрдм рдореБрдЦреНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХрд░реАрдм рд╕реЗ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдХреЛ рджреВрд╕рд░реЗ рд╕реЗ рдкрд╣рд▓реЗ рдЧрдгрдирд╛ рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдХреЛ рджреВрд╕рд░реЗ рдХреЗ рд▓рд┐рдП рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рдЧрдгрдирд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдпрд╣ рдЯреНрд░рд┐рдХ рд╢рд╛рдирджрд╛рд░ рдХрд╛рдо рдХрд░рддреА рд╣реИред
рдЧрдгрдирд╛ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдЪрд░рдг рдореЗрдВ, рдХрдВрдкрд╛рдЗрд▓рд░ рдирдИ рдмрджрд▓реА рд╣реБрдИ рджреБрдирд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдкрд╛рд╕ рдХрд░реЗрдЧрд╛ред
рд╣реБрдб рдХреЗ рддрд╣рдд, print рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:



рдЕрдм рдореБрдЦреНрдп рд╕рд┐рд░реНрдл рднрдпрд╛рдирдХ рд▓рдЧ рд░рд╣рд╛ рд╣реИред рдЖрдЗрдП AskUser рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдРрд╕рд╛ рд╣реА рдХрд░реЗрдВ:

 askUser :: World -> ([Integer],World) 

рдХреЛ
 askUser :: IO [Integer] askUser = do putStrLn "  :" input <- getLine let maybeList = getListFromString input in case maybeList of Just l -> return l Nothing -> askUser 

рдХреЗ рдмрд╛рдж

 askUser w0 = let (_,w1) = putStrLn "Enter a list of numbers:" in let (input,w2) = getLine w1 in let (l,w3) = case getListFromString input of Just l -> (l,w2) Nothing -> askUser w2 in (l,w3) 

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдмрджрд╕реВрд░рдд рд╣реИред рдмрд╕ рдЗрди рдЕрдирд╛рдбрд╝реА w* рдЪрд░ рдХреЛ рджреЗрдЦреЛред

рд╣рдордиреЗ рдЬреЛ рд╕рдмрдХ рд╕реАрдЦрд╛ рд╣реИ, рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рд╢реБрджреНрдз рднрд╛рд╖рд╛ рдореЗрдВ I / O рдХрд╛ рдЕрдиреБрднрд╡рд╣реАрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рднрдпрд╛рдирдХ рд▓рдЧрддрд╛ рд╣реИред

рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдкреНрд░рддреНрдпрдХреНрд╖ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИред рд╣рдо рдкреИрдЯрд░реНрди рджреЗрдЦрддреЗ рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдХреЛ рдЗрд╕ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:
 let (y,w') = action xw in 


рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдкрд╣рд▓реЗ рдкреИрд░рд╛рдореАрдЯрд░ x рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рдкрд░рд┐рдгрд╛рдо рдПрдХ рдпреБрдЧрд▓ (answer, newWorldValue) ред рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди f рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП:
 f :: World -> (a,World) 

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдордиреЗ рдпрд╣ рднреА рджреЗрдЦрд╛ рдХрд┐ рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрд╣реБрдд рд╕рдорд╛рди рд╣реИ:
 let (y,w1) = action1 w0 in let (z,w2) = action2 w1 in let (t,w3) = action3 w2 in ... 


рдкреНрд░рддреНрдпреЗрдХ рдХреНрд░рд┐рдпрд╛ рд╢реВрдиреНрдп рд╕реЗ n рдорд╛рдкрджрдВрдбреЛрдВ рддрдХ рд╣реЛ рд╕рдХрддреА рд╣реИред рдФрд░, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдкреНрд░рддреНрдпреЗрдХ рдХреНрд░рд┐рдпрд╛ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд┐рдЫрд▓реА рдкрдВрдХреНрддрд┐ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд▓реЗ рд╕рдХрддреА рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
 let (_,w1) = action1 x w0 in let (z,w2) = action2 w1 in let (_,w3) = action3 xz w2 in ... 


рдФрд░, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, actionN w :: (World) -> (a,World) ред

рдорд╣рддреНрд╡рдкреВрд░реНрдг! рдХреЗрд╡рд▓ рджреЛ рдкреИрдЯрд░реНрди рд╣реИрдВ рдЬрд┐рди рдкрд░ рдЖрдкрдХреЛ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП:
 let (x,w1) = action1 w0 in let (y,w2) = action2 x w1 in 

рдФрд░
 let (_,w1) = action1 w0 in let (y,w2) = action2 w1 in 






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

 bind :: (World -> (a,World)) -> (a -> (World -> (b,World))) -> (World -> (b,World)) 


рдпрд╣ рдордд рднреВрд▓реЛ рдХрд┐ (World -> (a,World)) IO рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИред
рдЖрдЗрдП рд╕рд░рд▓рддрд╛ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдирд╛рдо рдмрджрд▓реЗрдВ:

 type IO a = World -> (a, World) 


рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг:

 getLine :: IO String print :: Show a => a -> IO () 


getLine рдПрдХ IO рдХреНрд░рд┐рдпрд╛ рд╣реИ рдЬреЛ рджреБрдирд┐рдпрд╛ рдХреЛ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддреА рд╣реИ рдФрд░ рдПрдХ рдЬреЛрдбрд╝реА (String,World) рд▓реМрдЯрд╛рддреА рд╣реИред рдЖрдк рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ getLine рдкреНрд░рдХрд╛рд░ рдПрдХ IO String ред
рд╣рдо рдЗрд╕реЗ рдПрдХ IO рдХреНрд░рд┐рдпрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рднреА рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╣рдореЗрдВ "IO рдореЗрдВ рд╕рдВрд▓рдЧреНрди" рд╕реНрдЯреНрд░рд┐рдВрдЧ рджреЗрддрд╛ рд╣реИред

print рдлрд╝рдВрдХреНрд╢рди рднреА рдХрд╛рдлреА рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред рдпрд╣ рдПрдХ рдЗрдирдкреБрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рд▓реЗрддрд╛ рд╣реИ, рдЬреЛ рддрдм рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдХреЗ рджреЛ рдорд╛рдкрджрдВрдб рд╣реИрдВред рдкрд╣рд▓рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рд╡рд╣ рдорд╛рди рд╣реИ рдЬреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рджреВрд╕рд░рд╛ рджреБрдирд┐рдпрд╛ рдХреА рд╕реНрдерд┐рддрд┐ рд╣реИред рдирддреАрдЬрддрди, рдпрд╣ рдПрдХ рдЬреЛрдбрд╝реА ((),World) ред рдпрд╣реА рд╣реИ, рдпрд╣ рджреБрдирд┐рдпрд╛ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрджрд▓рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЛрдИ рдбреЗрдЯрд╛ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдпрд╣ рдкреНрд░рдХрд╛рд░ bind рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдк рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рд╕рд░рд▓ рдХрд░реЗрдЧрд╛:

 bind :: IO a -> (a -> IO b) -> IO b 


bind рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ 2 IO рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ рдЕрдиреНрдп IO рдХрд╛рд░реНрд░рд╡рд╛рдИ рд▓реМрдЯрд╛рддрд╛ рд╣реИред

рдЕрдм, рдХреБрдЫ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкреИрдЯрд░реНрди рддрд╛рдЬрд╝рд╛ рдХрд░реЗрдВред рдкрд╣рд▓рд╛ рдЗрд╕ рддрд░рд╣ рдерд╛:
 let (x,w1) = action1 w0 in let (y,w2) = action2 x w1 in (y,w2) 


рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ:
 action1 :: IO a action2 :: a -> IO b (y,w2) :: IO b 

рдкрд░рд┐рдЪрд┐рдд рд▓рдЧрддрд╛ рд╣реИ, рд╣реИ рдирд╛?
 (bind action1 action2) w0 = let (x, w1) = action1 w0 (y, w2) = action2 x w1 in (y, w2) 

рдореВрд▓ рд╡рд┐рдЪрд╛рд░ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд┐рд╢реНрд╡ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдЫрд┐рдкрд╛рдирд╛ рд╣реИред рдЪрд▓реЛ рдЪрд▓рддреЗ рд╣реИрдВ! рдпрд╣рд╛рдБ рдХреБрдЫ рдЪреАрдЬреЗрдВ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:
 let (line1,w1) = getLine w0 in let ((),w2) = print line1 in ((),w2) 


рдФрд░ рдЕрдм, рд╣рдо рдмрд╛рдЗрдВрдб рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:
 (res,w2) = (bind getLine (\l -> print l)) w0 


рдЪреВрдВрдХрд┐ рдкреНрд░рд┐рдВрдЯ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реИ (World -> ((),World)) , рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ res = () (рдЕрд╢рдХреНрдд рдкреНрд░рдХрд╛рд░)ред
рдпрджрд┐ рдЖрдкрдХреЛ рдпрд╣рд╛рдВ рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рд╕реНрдЯреНрд░реАрдЯ рдореИрдЬрд┐рдХ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ, рддреЛ рддреАрди-рд▓рд╛рдЗрди рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред
 let (line1,w1) = getLine w0 in let (line2,w2) = getLine w1 in let ((),w3) = print (line1 ++ line2) in ((),w3) 

рдЬреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЗ рд╕рдорд╛рди рд╣реИ:
 (res,w3) = bind getLine (\line1 -> bind getLine (\line2 -> print (line1 ++ line2))) 


рдХреНрдпрд╛ рдЖрдкрдиреЗ рдЕрднреА рдЧреМрд░ рдХрд┐рдпрд╛ рд╣реИ?
рд╣рд╛рдБ, рдЕрдм рдФрд░ рдирд╣реАрдВ рд╡рд┐рд╢реНрд╡ рдЕрд╕реНрдерд╛рдпреА рдЪрд░!
рдпрд╣ рдПрдо.рдП. рдЬреАрдЖрдИ ред рдореИрдВ рд╣реВрдВ

рд▓реЗрдХрд┐рди рд╣рдо рдПрдХ рдЕрд▓рдЧ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЖрдЗрдП bind рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ (>>=) ред
(>>=) рдпрд╣ рдПрдХ infix рдлрдВрдХреНрд╢рди рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐
(+) ; рдпрд╛рдж 3 + 4 тЗФ (+) 3 4

 (res,w3) = getLine >>= \line1 -> getLine >>= \line2 -> print (line1 ++ line2) 

рд╣реЛ рд╣реЛ рд╣реЛ! рд╕рднреА рдХреЛ рдирдпрд╛ рд╕рд╛рд▓ рдореБрдмрд╛рд░рдХ рд╣реЛ! рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╕рд┐рдВрдЯреЗрдХреНрд╕ рдЪреАрдиреА рд╣реИ:

 do x <- action1 y <- action2 z <- action3 ... 


рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

 action1 >>= \x -> action2 >>= \y -> action3 >>= \z -> ... 


рдЖрдк action2 рдореЗрдВ x рдФрд░ action2 рдореЗрдВ y рд╕рд╛рде x рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд▓реЗрдХрд┐рди рдЙрди рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рдЬреЛ <- рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ?
рдЖрд░рд╛рдо рд╕реЗ! рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ blindBind рдХрд╛рд░реНрдп рд╣реИ:
 blindBind :: IO a -> IO b -> IO b blindBind action1 action2 w0 = bind action (\_ -> action2) w0 


рдореИрдВрдиреЗ рдЬрд╛рдирдмреВрдЭрдХрд░ рдЗрд╕ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рд╕рд░рд▓ рдирд╣реАрдВ рдмрдирд╛рдпрд╛ред
рдмреЗрд╢рдХ, рдпрджрд┐ рд╣рдо рдХреЛрдб рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдСрдкрд░реЗрдЯрд░ (>>) рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдФрд░ рдРрд╕рд╛ рд╣реИ

 do action1 action2 action3 


рдореЗрдВ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИ
 action1 >> action2 >> action3 

рд╡реИрд╕реЗ, рдпрд╣рд╛рдБ рдПрдХ рдФрд░ рдХрд╛рдлреА рдЙрдкрдпреЛрдЧреА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ:
 putInIO :: a -> IO a putInIO x = IO (\w -> (x,w)) 


рдпрд╣ рд╢реБрджреНрдз рдорд╛рдиреЛрдВ рдХреЛ "IO рд╕рдВрджрд░реНрдн" рдореЗрдВ рдзрдХреЗрд▓рдиреЗ рдХрд╛ рдорд╛рдирдХ рддрд░реАрдХрд╛ рд╣реИред
рдЖрдорддреМрд░ рдкрд░ putInIO рдХреЛ return рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╣рд╛рд╕реНрдХреЗрд▓ рд╕реАрдЦрдиреЗ рдкрд░ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдирд╛рдо рдмрд╣реБрдд рднреНрд░рдорд┐рдд рд╣реИред return рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рд╕рд╛рдерд┐рдпреЛрдВ рд╕реЗ рдмрд╣реБрдд рдЕрд▓рдЧ рд╣реИред



03_рд╣реЗрд▓ / 01_IO / 21_Detailled_IO.lhs

рдЕрдВрдд рдореЗрдВ, рдЖрдЗрдП рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦреЗрдВ:
 askUser :: IO [Integer] askUser = do putStrLn "  ,  :" input <- getLine let maybeList = getListFromString input in case maybeList of Just l -> return l Nothing -> askUser main :: IO () main = do list <- askUser print $ sum list 


рдХреЗ рд░реВрдк рдореЗрдВ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

 import Data.Maybe maybeRead :: Read a => String -> Maybe a maybeRead s = case reads s of [(x,"")] -> Just x _ -> Nothing getListFromString :: String -> Maybe [Integer] getListFromString str = maybeRead $ "[" ++ str ++ "]" askUser :: IO [Integer] askUser = putStrLn "  ,  :" >> getLine >>= \input -> let maybeList = getListFromString input in case maybeList of Just l -> return l Nothing -> askUser main :: IO () main = askUser >>= \list -> print $ sum list 


рдЕрдм рдЖрдк рдЗрд╕ рдХреЛрдб рдХреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдФрд░ рдЕрдм, рдЖрдЗрдП рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдпрд╣ рд╕рдм рдмрд┐рдирд╛ (>>) рдФрд░ (>>=) рдХреИрд╕реЗ рджрд┐рдЦреЗрдЧрд╛ред

03_рд╣реЗрд▓ / 01_IO / 21_Detailled_IO.lhs



03_рд╣реЗрд▓ / 02_Monads / 10_Monads.lhs

рдЗрдХрд╛рдИ




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

рдорд╣рддреНрд╡рдкреВрд░реНрдг рдиреЛрдЯ :

  • рдЬрд░реВрд░реА рдирд╣реАрдВ рдХрд┐ рджреБрд╖реНрдкреНрд░рднрд╛рд╡ рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯреНрд╕ рд╕реЗ рдЬреБрдбрд╝реЗ рд╣реЛрдВ!
    рдХрдИ рд╢реБрджреНрдз рдорда рд╣реИрдВред
  • рдордареЛрдВ рдХрд╛ рд╕рд╛рд░ рдЧрдгрдирд╛ рдХреА рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рд╣реИ



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

 class Monad m where (>>=) :: ma -> (a -> mb) -> mb return :: a -> ma (>>) :: ma -> mb -> mb f >> g = f >>= \_ -> g --         --         fail :: String -> ma fail = error 

рдЯрд┐рдкреНрдкрдгреА:

  • class рдХреАрд╡рд░реНрдб рд╡рд╣ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдЖрдк рд╕реЛрдЪрддреЗ рд╣реИрдВред
    рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рдПрдХ рд╡рд░реНрдЧ рдУрдУрдкреА рд╕реЗ рдПрдХ рд╡рд░реНрдЧ рдирд╣реАрдВ рд╣реИ ред
    рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рдПрдХ рд╡рд░реНрдЧ рдЬрд╛рд╡рд╛ рдпрд╛ рд╕реА # рдореЗрдВ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рддрд░рд╣ рд╣реИред
    рдЗрд╕реЗ typeclass рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ред
    рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдмрд╣реБрдд рд╕рд╛рд░реА рдХрдХреНрд╖рд╛рдПрдВред
    рдЗрд╕ рд╡рд░реНрдЧ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП, рдкреНрд░рдХрд╛рд░ рдХреЛ рдХрдХреНрд╖рд╛ рдХреЗ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
  • рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЯрд╛рдЗрдк m рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдПрдХ рддрд░реНрдХ рд▓реЗ рд╕рдХрддрд╛ рд╣реИред
    рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП IO a , рд╕рд╛рде рд╣реА рд╕рд╛рде Maybe a , [a] рдЗрддреНрдпрд╛рджрд┐ред
  • рдПрдХ рдЙрдкрдпреЛрдЧреА рдореЛрдирд╛рдж рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЗ рдХрд╛рд░реНрдп рдХреЛ рдХреБрдЫ рдХрд╛рдиреВрдиреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
    рдпрджрд┐ рдЖрдкрдХрд╛ рдХрд╛рд░реНрдп рдЗрди рдХрд╛рдиреВрдиреЛрдВ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЕрдЬреАрдм рдЪреАрдЬреЗрдВ рдШрдЯрд┐рдд рд╣реЛрдВрдЧреА:
     return a >>= k == ka m >>= return == m m >>= (\x -> kx >>= h) == (m >>= k) >>= h 





рд╢рд╛рдпрдж рд╕рдиреНрдпрд╛рд╕реА рд╣реИ



рдХрдИ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ рдЬреЛ Monad рдЙрджрд╛рд╣рд░рдг рд╣реИрдВред
Maybe рд╕рдмрд╕реЗ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рд╣реИред
рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ Maybe рдорд╛рдиреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реИ, рддреЛ рдЖрдк рдЙрдирдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рдзреБрдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдпрд╣ рдиреЗрд╕реНрдЯреЗрдб рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ if..then..else..

рдПрдХ рдЬрдЯрд┐рд▓ рдмреИрдВрдХрд┐рдВрдЧ рдСрдкрд░реЗрд╢рди рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ, рдЖрдк рдХреЗрд╡рд▓ ifрежреж рдХреЗ рдмреЛрдирд╕ рдХрд╛ рджрд╛рд╡рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЛрдгреЛрдВ рдореЗрдВ рдЬрд╛рдиреЗ рдХреЗ рдмрд┐рдирд╛ рд▓реЗрдирджреЗрди рдХрд╛ рдЗрддрд┐рд╣рд╛рд╕ рд╣реИред

 deposit value account = account + value withdraw value account = account - value eligible :: (Num a,Ord a) => a -> Bool eligible account = let account1 = deposit 100 account in if (account1 < 0) then False else let account2 = withdraw 200 account1 in if (account2 < 0) then False else let account3 = deposit 100 account2 in if (account3 < 0) then False else let account4 = withdraw 300 account3 in if (account4 < 0) then False else let account5 = deposit 1000 account4 in if (account5 < 0) then False else True main = do print $ eligible 300 -- True print $ eligible 299 -- False 

03_рд╣реЗрд▓ / 02_Monads / 10_Monads.lhs



03_рд╣реЗрд▓ / 02_Monads / 11_Monads.lhs

рдФрд░ рдЕрдм рдЖрдЗрдП рд╢рд╛рдпрдж рдЗрд╕ рдХреЛрдб рдореЗрдВ рдЪреАрдЬреЛрдВ рдХреЛ рдХреНрд░рдо рдореЗрдВ рд░рдЦреЗрдВ рдФрд░ рд╢рд╛рдпрдж рдЗрд╕рдХреА рдореЛрдирдб рдЗрдХрд╛рдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
 deposit :: (Num a) => a -> a -> Maybe a deposit value account = Just (account + value) withdraw :: (Num a,Ord a) => a -> a -> Maybe a withdraw value account = if (account < value) then Nothing else Just (account - value) eligible :: (Num a, Ord a) => a -> Maybe Bool eligible account = do account1 <- deposit 100 account account2 <- withdraw 200 account1 account3 <- deposit 100 account2 account4 <- withdraw 300 account3 account5 <- deposit 1000 account4 Just True main = do print $ eligible 300 -- Just True print $ eligible 299 -- Nothing 


03_рд╣реЗрд▓ / 02_Monads / 11_Monads.lhs



03_рд╣реЗрд▓ / 02_Monads / 12_Monads.lhs

рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдФрд░ рднреА рдмреЗрд╣рддрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 deposit :: (Num a) => a -> a -> Maybe a deposit value account = Just (account + value) withdraw :: (Num a,Ord a) => a -> a -> Maybe a withdraw value account = if (account < value) then Nothing else Just (account - value) eligible :: (Num a, Ord a) => a -> Maybe Bool eligible account = deposit 100 account >>= withdraw 200 >>= deposit 100 >>= withdraw 300 >>= deposit 1000 >> return True main = do print $ eligible 300 -- Just True print $ eligible 299 -- Nothing 


рдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ рд╕рд╛рдмрд┐рдд рдХрд░ рджрд┐рдпрд╛ рд╣реИ рдХрд┐ рднрд┐рдХреНрд╖реБ рд╣рдорд╛рд░реЗ рдХреЛрдб рдХреЛ рдЕрдзрд┐рдХ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдЖрдо рддреМрд░ рдкрд░, Maybe рд╕рдорд╛рди рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдПрдХ рд╕рдорд╛рди рдЙрдкрдпреЛрдЧ рд╣реЛрдЧрд╛ред
рдпрд╣ рдПрдХ рдХрд╛рдлреА рдкреНрд░рд╛рдХреГрддрд┐рдХ рдбрд┐рдЬрд╛рдЗрди рд╣реИред

рдорд╣рддреНрд╡рдкреВрд░реНрдг рдиреЛрдЯ:

рдкрд╣рд▓реА рдЧрдгрдирд╛, рдЬрд┐рд╕рдХрд╛ рдкрд░рд┐рдгрд╛рдо Nothing рдЖрдЧреЗ рдХреА рд╕рднреА рдЧрдгрдирд╛рдУрдВ рдХреЛ рд░реЛрдХ рджреЗрдЧрд╛ред
рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рд╕рднреА рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред
рдФрд░ рдпрд╣ рдЕрдиреБрдХреВрд▓рди рдЖрдкрдХреЗ рд▓рд┐рдП рдмрд┐рд▓реНрдХреБрд▓ рдореБрдлреНрдд рдЙрдкрд▓рдмреНрдз рд╣реИ, рднрд╛рд╖рд╛ рдХреЗ рдЖрд▓рд╕реНрдп рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред


рдЖрдк Maybe рд▓рд┐рдП рдкрд░рд┐рднрд╛рд╖рд╛ (>>=) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ
:
 instance Monad Maybe where (>>=) :: Maybe a -> (a -> Maybe b) -> Maybe b Nothing >>= _ = Nothing (Just x) >>= f = fx return x = Just x 


Maybe рдХрд┐ рдЗрддрдиреЗ рдЫреЛрдЯреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рднреА рдореЛрдирд╛рдб рдЙрдкрдпреЛрдЧреА рд╕рд╛рдмрд┐рдд рд╣реБрдЖ Maybe ред рд╣рдордиреЗ рдореЛрдиреЛ IO рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рднреА рджреЗрдЦрд╛ред рд▓реЗрдХрд┐рди рдПрдХ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рдЙрджрд╛рд╣рд░рдг рд╣реИ - рд╕реВрдЪрд┐рдпрд╛рдВред

03_рд╣реЗрд▓ / 02_Monads / 12_Monads.lhs



03_рд╣реЗрд▓ / 02_Monads / 13_Monads.lhs

рд╕рдирдж рд░рд╣реЗ



рд╕реВрдЪреА рдореЛрдирдб рд╣рдореЗрдВ рдЧреИрд░-рдирд┐рдпрддрд╛рддреНрдордХ рд╕рдВрдЧрдгрдирд╛ рдХреЛ рдореЙрдбрд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
 import Control.Monad (guard) allCases = [1..10] resolve :: [(Int,Int,Int)] resolve = do x <- allCases y <- allCases z <- allCases guard $ 4*x + 2*y < z return (x,y,z) main = do print resolve 

рдПрдордПред рд╕реИрдирд┐рдХред рд╣рд╛рдВ:

 [(1,1,7),(1,1,8),(1,1,9),(1,1,10),(1,2,9),(1,2,10)] 


рд╕реВрдЪреА рдореЗрдВ рдореЛрдирд╛рдб рдХреЗ рд▓рд┐рдП рд╕рд┐рдВрдереЗрдЯреНрд░рд┐рдХ рд╢реБрдЧрд░ рднреА рд╣реИ:

  print $ [ (x,y,z) | x <- allCases, y <- allCases, z <- allCases, 4*x + 2*y < z ] 


рдореИрдВ рднрд┐рдХреНрд╖реБрдУрдВ рдХреА рдкреВрд░реА рд╕реВрдЪреА рдирд╣реАрдВ рджреВрдВрдЧрд╛, рдЙрдирдореЗрдВ рд╕реЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╣реИрдВред
рдореЛрдирдбреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХрдИ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рд░рд▓ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИред
рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдорда рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реИрдВ:



рдпрджрд┐ рдЖрдк рдЗрд╕ рдЬрдЧрд╣ рдкрд░ рдЖрддреЗ рд╣реИрдВ, рддреЛ рдмрдзрд╛рдИ!
рдЕрдм рдЖрдк рдХреБрдВрдЧ рдлреВ рд╕рд╛рдзреБрдУрдВ рдХреЛ рдЬрд╛рдирддреЗ рд╣реИрдВ ! (рдмреЗрд╢рдХ, рдЖрдкрдХреЛ рдЙрдирдХреА рдЖрджрдд рдбрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрднреНрдпрд╛рд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдЕрдкрдиреЗ рдЦреБрдж рдХреЗ рдПрдХ рдЬреЛрдбрд╝реЗ рдХреЛ рд▓рд┐рдЦреЗрдВред рд▓реЗрдХрд┐рди рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рджрд┐рд╢рд╛ рдореЗрдВ рдПрдХ рдмрдбрд╝рд╛ рдХрджрдо рдЙрдард╛рдпрд╛ рд╣реИ)

03_рд╣реЗрд▓ / 02_Monads / 13_Monads.lhs

рдЖрд╡реЗрджрди



рдпрд╣ рдЦрдВрдб рд╣рд╛рд╕реНрдХреЗрд▓ рдХреЗ рдЕрдзреНрдпрдпрди рдкрд░ рд╕реАрдзреЗ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рд╣рдо рд╕рд┐рд░реНрдл рдХреБрдЫ рд╡рд┐рд╡рд░рдгреЛрдВ рдкрд░ рдЕрдзрд┐рдХ рдзреНрдпрд╛рди рджреЗрддреЗ рд╣реИрдВред



04_Appendice / 01_More_on_infinite_trees / 10_Infinite_Trees.lhs

рдЕрдВрддрд╣реАрди рдкреЗрдбрд╝реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдФрд░ рдмрд╛рдд



рдЕрдирдВрдд рд╕рдВрд░рдЪрдирд╛ рдЦрдВрдб рдореЗрдВ, рд╣рдордиреЗ рд╕рд░рд▓ рдЕрдирдВрдд рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рдПрдХ рдЬреЛрдбрд╝реЗ рдХреЛ рджреЗрдЦрд╛ рд╣реИред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд╣рдорд╛рд░реЗ рдкреЗрдбрд╝ рдиреЗ рджреЛ рдЧреБрдг рдЦреЛ рджрд┐рдП рд╣реИрдВ:

  1. рдЯреНрд░реА рдиреЛрдбреНрд╕ рдореЗрдВ рдХреЛрдИ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдирд╣реАрдВ рд╣реИ
  2. рдкреЗрдбрд╝ рдХрд╛ рдЖрджреЗрд╢ рджрд┐рдпрд╛


рдЗрд╕ рдЦрдВрдб рдореЗрдВ, рд╣рдо рдкрд╣рд▓реЗ рд╕рдВрдкрддреНрддрд┐ рд╕реЗ рдирд┐рдкрдЯреЗрдВрдЧреЗред
рджреВрд╕рд░реЗ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, рд╣рдо рдЗрд╕реЗ рдереЛрдбрд╝рд╛ рдХрдордЬреЛрд░ рдХрд░ рджреЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдЖрджрд░реНрд╢ рдХреЗ рдЬрд┐рддрдирд╛ рдХрд░реАрдм рд╣реЛ рд╕рдХреЗ рдЙрддрдиреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВред

рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЫрджреНрдо рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рд╕рдореВрд╣ рд╕реЗ рдПрдХ рд╕реВрдЪреА рдмрдирд╛рдПрдБ:

 shuffle = map (\x -> (x*3123) `mod` 4331) [1..] 


рд╕реНрдореГрддрд┐ рдХреЛ рддрд╛рдЬрд╝рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХрд░реЗрдВ treeFromList
 treeFromList :: (Ord a) => [a] -> BinTree a treeFromList [] = Empty treeFromList (x:xs) = Node x (treeFromList (filter (<x) xs)) (treeFromList (filter (>x) xs)) 

рдФрд░ treeTakeDepth:

 treeTakeDepth _ Empty = Empty treeTakeDepth 0 _ = Empty treeTakeDepth n (Node x left right) = let nl = treeTakeDepth (n-1) left nr = treeTakeDepth (n-1) right in Node x nl nr 


рдЖрдЗрдП рджреЗрдЦреЗрдВ рдкрд░рд┐рдгрд╛рдо:
 main = do putStrLn "take 10 shuffle" print $ take 10 shuffle putStrLn "\ntreeTakeDepth 4 (treeFromList shuffle)" print $ treeTakeDepth 4 (treeFromList shuffle) 


 % runghc 02_Hard_Part/41_Infinites_Structures.lhs take 10 shuffle [3123,1915,707,3830,2622,1414,206,3329,2121,913] treeTakeDepth 4 (treeFromList shuffle) < 3123 : |--1915 : | |--707 : | | |--206 : | | `--1414 : | `--2622 : | |--2121 : | `--2828 : `--3830 : |--3329 : | |--3240 : | `--3535 : `--4036 : |--3947 : `--4242 

рд╣реБрд░реНрд░реЗ! рдЬреАрдд рдЧрдП рд╣реИрдВ! рд▓реЗрдХрд┐рди рдпрд╣ рдХреЗрд╡рд▓ рддрднреА рдХрд╛рдо рдХрд░реЗрдЧрд╛ рдЬрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рд╢рд╛рдЦрд╛ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╣реЛрдЧрд╛ред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
 treeTakeDepth 4 (treeFromList [1..]) 


рдЕрдВрддрд╣реАрди рд░реВрдк рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдб рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдкреНрд░рдореБрдЦ рдкрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИ filter (<1) [2..]ред
рд▓реЗрдХрд┐рди filterрдпрд╣ рд╕рдордЭрдиреЗ рдореЗрдВ рдЗрддрдирд╛ рд╕реНрдорд╛рд░реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдПрдХ рдЦрд╛рд▓реА рд╕реВрдЪреА рд╣реИред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдХрд┐ рдЧреИрд░-рд╕рдЦреНрдд рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреНрдпрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдкрд╛рдардХ рдХреЗ рд▓рд┐рдП рд╡реНрдпрд╛рдпрд╛рдо рдХрд░реЗрдВ:



04_Appendice / 01_More_on_infinite_trees / 10_Infinite_Trees.lhs



04_Appendice / 01_More_on_infinite_trees / 11_Infinite_Trees.lhs

рдереЛрдбрд╝рд╛ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд
treeFromListрдФрд░ shuffleрдЗрд╕ рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреЗред

рдкрд╣рд▓реА рд╕рдорд╕реНрдпрд╛ рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреА рдХрдореА рд╣реИ shuffleред
рд╣рдордиреЗ рдХреЗрд╡рд▓ 4331рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдВрдЦреНрдпрд╛рдПрдБ рдЙрддреНрдкрдиреНрди рдХреАрдВред
рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдп рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░реЗрдВ shuffleред

 shuffle = map rand [1..] where rand x = ((px) `mod` (x+c)) - ((x+c) `div` 2) px = m*x^2 + n*x + o -- some polynome m = 3123 n = 31 o = 7641 c = 1237 


рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдпрд╣ рд╕рдВрд╕реНрдХрд░рдг рдЕрдЪреНрдЫрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ (рдореБрдЭреЗ рдкреВрд░реА рдЙрдореНрдореАрдж рд╣реИ) рдореВрд▓реНрдпреЛрдВ рдкрд░ рдПрдХ рдКрдкрд░реА рдФрд░ рдирд┐рдЪрд▓рд╛ рдмрд╛рдЙрдВрдб рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдПрдХ рдЕрдВрддрд╣реАрди рд▓реВрдк рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдлреЗрд░рдмрджрд▓ рдореЗрдВ рд╕реБрдзрд╛рд░ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИред

рдХрдбрд╝рд╛рдИ рд╕реЗ рдмреЛрд▓рдиреЗ рдкрд░, рд╣рдо рдпрд╣ рдирд╣реАрдВ рдХрд╣ рд╕рдХрддреЗ рдХрд┐ рд╕реВрдЪреА рдЦрд╛рд▓реА рд╣реИ рдпрд╛ рдирд╣реАрдВ filter (<x) xsред
рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рд╣рдорд╛рд░реЗ рдмрд╛рдЗрдирд░реА рдЯреНрд░реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдереЛрдбрд╝рд╛ рддреЛрдбрд╝ рджреВрдВрдЧрд╛ред рдирдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рдХреБрдЫ рдиреЛрдбреНрд╕ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╢рд░реНрдд рдкреВрд░реА рдирд╣реАрдВ рд╣реЛрдЧреА:

рдкреЗрдбрд╝ рдХреЗ рдореВрд▓ рдореЗрдВ рдореВрд▓реНрдп рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╛рдПрдВ (рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ред рдЕрдзрд┐рдХрд╛рд░) рдХреЗ рдХрд┐рд╕реА рднреА рддрддреНрд╡ рдХреЛ рдХрдбрд╝рд╛рдИ рд╕реЗ рдХрдо (рд╕рдореНрдорд╛рди рдЕрдзрд┐рдХ) рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред


рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреЗрдбрд╝ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдЖрджреЗрд╢рд┐рдд рд░рд╣реЗрдЧрд╛ ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкреЗрдбрд╝ рдмрдирд╛рдиреЗ рдХреЗ рдЪрд░рдг рдореЗрдВ, рд╣рдо рдиреЛрдбреНрд╕ рдХреА рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВрдЧреЗред

рдирдП рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, treeFromListрд╣рдордиреЗ рдЗрд╕реЗ рдЗрд╕рдХреЗ filterрд╕рд╛рде рдмрджрд▓ рджрд┐рдпрд╛ safefilterред

 treeFromList :: (Ord a, Show a) => [a] -> BinTree a treeFromList [] = Empty treeFromList (x:xs) = Node x left right where left = treeFromList $ safefilter (<x) xs right = treeFromList $ safefilter (>x) xs 


рдлрд╝рдВрдХреНрд╢рди safefilterрд▓рдЧрднрдЧ рд╕рдорд╛рди рд╣реИ filterрд▓реЗрдХрд┐рди рдЕрдВрддрд╣реАрди рдкреЗрдбрд╝реЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╕рдордп рдПрдХ рдЕрдВрддрд╣реАрди рд▓реВрдк рдореЗрдВ рдирд╣реАрдВ рдЧрд┐рд░рддрд╛ рд╣реИред рдпрджрд┐ рдЙрд╕реЗ 10,000 рдЪрд░рдгреЛрдВ рдореЗрдВ рдЙрдкрдпреБрдХреНрдд рд╡рд╕реНрддреБ рдирд╣реАрдВ рдорд┐рд▓ рд░рд╣реА рд╣реИ, рддреЛ рд╡рд╣ рдЦреЛрдЬ рдХреЛ рд░рджреНрдж рдХрд░ рджреЗрддреА рд╣реИред

 safefilter :: (a -> Bool) -> [a] -> [a] safefilter fl = safefilter' fl nbTry where nbTry = 10000 safefilter' _ _ 0 = [] safefilter' _ [] _ = [] safefilter' f (x:xs) n = if fx then x : safefilter' f xs nbTry else safefilter' f xs (n-1) 


рдХрд╛рд░реНрдпрдХреНрд░рдо рдЪрд▓рд╛рдПрдВ рдФрд░ рдЖрдирдиреНрджрд┐рдд рд╣реЛрдВ:

 main = do putStrLn "take 10 shuffle" print $ take 10 shuffle putStrLn "\ntreeTakeDepth 8 (treeFromList shuffle)" print $ treeTakeDepth 8 (treeFromList $ shuffle) 


, .
, Haskell .
.

8 100 ,
, !


:



 treeFromList' [] n = Empty treeFromList' (x:xs) n = Node x left right where left = treeFromList' (safefilter' (<x) xs (fn) right = treeFromList' (safefilter' (>x) xs (fn) f = ??? 


04_Appendice/01_More_on_infinite_trees/ 11_Infinite_Trees.lhs


( , )



рдзрдиреНрдпрд╡рд╛рдж /r/haskellрдФрд░
/r/programmingред
рдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ рдЕрдореВрд▓реНрдп рд╣реИрдВред

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

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


All Articles