рдЕрдиреБрд╡рд╛рдж рдХрд╛ рджреВрд╕рд░рд╛ рднрд╛рдЧ рд╣рд╛рд╕реНрдХреЗрд▓ рдХрд╛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдФрд░ рдХрдард┐рди рдкрд░рд┐рдЪрдп рд╣реИред рдкрд╣рд▓реЗ рд╡рд╛рд▓рд╛
рдпрд╣рд╛рдБ рдЙрдкрд▓рдмреНрдз
рд╣реИредрдпрд╣рд╛рдВ рдореВрд▓
рдзрд┐рдХреНрдХрд╛рд░ рд╣реИ рдХрдард┐рди рд╣рд┐рд╕реНрд╕рд╛
рдмрдзрд╛рдИ! рддреБрдо рд╕рдЪ рдореЗрдВ рдмрд╣реБрдд рджреВрд░ рд╣реЛ рдЧрдПред
рдФрд░ рдЕрдм рдХрдЪрд░рд╛, рдЕрдкрд╢рд┐рд╖реНрдЯ рдФрд░ рд╕реЛрдбреЛрдореА рд╢реБрд░реВ рд╣реЛ рдЬрд╛рдПрдЧрд╛ :)ред
рдпрджрд┐ рдЖрдк рдФрд░ рдореИрдВ рдПрдХ рдЬреИрд╕реЗ рд╣реИрдВ, рддреЛ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╢реИрд▓реА рдореЗрдВ рдереЛрдбрд╝рд╛ рдЖрдЧреЗ рдмрдврд╝ рдЪреБрдХреЗ рд╣реИрдВред рдЖрдк рдЙрди рд▓рд╛рднреЛрдВ рдХреЛ рд╕рдордЭрддреЗ рд╣реИрдВ рдЬреЛ рдЖрд▓рд╕реНрдп рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рджреЗрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЖрдк рдЕрднреА рднреА рдХрд╛рдлреА рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдЖрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреИрд╕реЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ:
- рджреБрд╖реНрдкреНрд░рднрд╛рд╡ рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ?
- рдЗрдирдкреБрдЯ-рдЖрдЙрдЯрдкреБрдЯ (IO) рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЕрдЬреАрдм рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рдереА?
рддреИрдпрд╛рд░ рд╣реЛ рдЬрд╛рдУ, рдЬрд╡рд╛рдм рд╕рдмрд╕реЗ рд╕рд░рд▓ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
рд▓реЗрдХрд┐рди рдЙрдирдХреЗ рд▓рд╛рдн рдирд┐рд░реНрд╡рд┐рд╡рд╛рдж рд╣реЛрдВрдЧреЗред
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
рдпрд╛
value <- action2
рдпреЗ рджреЛ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпрд╛рдБ рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИрдВред рдЖрдкрдХреЛ рдЕрдЧрд▓реЗ рднрд╛рдЧ рдХреЗ рдЕрдВрдд рддрдХ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреВрд░реА рдЬрд╛рдирдХрд╛рд░реА рд╣реЛ рдЬрд╛рдПрдЧреАред
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 a
рдХреА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред
рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕рдВрднрд╛рд╡рд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рдХрд╛рдлреА рд╕реАрдорд┐рдд рд╕реЗрдЯ рд╣реИ:
getLine
, print
, putStrLn
, рдЖрджрд┐ред - рд╕рдмрд╕реЗ рд╢реБрджреНрдз рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рд▓рд╛рдн рдЙрдард╛рдПрдВред
IO a
рдЯрд╛рдЗрдк рдХрд╛ рдЕрд░реНрде рд╣реИ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд - IO рдХреНрд░рд┐рдпрд╛ рдЬреЛ рдЯрд╛рдЗрдк a
рдХрд╛ рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ a
ред
рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП IO
рдкреНрд░рдХрд╛рд░, рдФрд░ IO a
рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдХрд╛рд░реНрдп рд╣реИред
рдпрджрд┐ рдЖрдк рдЕрднреА рднреА рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдЕрдЧрд▓реЗ рднрд╛рдЧ рдХреЛ рдкрдврд╝реЗрдВред
рдереЛрдбрд╝рд╛ рдЕрднреНрдпрд╛рд╕, рдФрд░
IO
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрдкрдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред
рд╡реНрдпрд╛рдпрд╛рдо :
- рдПрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рд▓рд┐рдЦреЗрдВ рдЬреЛ рдЖрдкрдХреЗ рд╕рднреА рддрд░реНрдХреЛрдВ рдХреЛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░реЗред рд╕рдВрдХреЗрдд:
getArgs
рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
03_Hell / 01_IO / 03_progressive_io_example.lhsIO рдЪрд╛рд▓ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг

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
рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХрдИ рд╡рд┐рдХрд▓реНрдк рд╣реЛрдВрдЧреЗ:
- рдЧрдгрдирд╛ рдХрд░реЗрдВ рддреЛ
a
b
рддреЛ fab
- рдкрд╣рд▓реЗ рдХрдВрдкреНрдпреВрдЯ
b
, рдлрд┐рд░ a
рдФрд░ рдЕрдВрдд рдореЗрдВ fab
ред - рдЧрдгрдирд╛
a
рдФрд░ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ b
рдФрд░ рдлрд┐рд░ 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
рдЯрд┐рдкреНрдкрдгреА:
рд╢рд╛рдпрдж рд╕рдиреНрдпрд╛рд╕реА рд╣реИ
рдХрдИ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ рдЬреЛ
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
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
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
рдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ рд╕рд╛рдмрд┐рдд рдХрд░ рджрд┐рдпрд╛ рд╣реИ рдХрд┐ рднрд┐рдХреНрд╖реБ рд╣рдорд╛рд░реЗ рдХреЛрдб рдХреЛ рдЕрдзрд┐рдХ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдЖрдо рддреМрд░ рдкрд░,
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рдЕрдВрддрд╣реАрди рдкреЗрдбрд╝реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдФрд░ рдмрд╛рдд
рдЕрдирдВрдд рд╕рдВрд░рдЪрдирд╛ рдЦрдВрдб рдореЗрдВ, рд╣рдордиреЗ рд╕рд░рд▓ рдЕрдирдВрдд рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рдПрдХ рдЬреЛрдбрд╝реЗ рдХреЛ рджреЗрдЦрд╛ рд╣реИред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд╣рдорд╛рд░реЗ рдкреЗрдбрд╝ рдиреЗ рджреЛ рдЧреБрдг рдЦреЛ рджрд┐рдП рд╣реИрдВ:- рдЯреНрд░реА рдиреЛрдбреНрд╕ рдореЗрдВ рдХреЛрдИ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдирд╣реАрдВ рд╣реИ
- рдкреЗрдбрд╝ рдХрд╛ рдЖрджреЗрд╢ рджрд┐рдпрд╛
рдЗрд╕ рдЦрдВрдб рдореЗрдВ, рд╣рдо рдкрд╣рд▓реЗ рд╕рдВрдкрддреНрддрд┐ рд╕реЗ рдирд┐рдкрдЯреЗрдВрдЧреЗредрджреВрд╕рд░реЗ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, рд╣рдо рдЗрд╕реЗ рдереЛрдбрд╝рд╛ рдХрдордЬреЛрд░ рдХрд░ рджреЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдЖрджрд░реНрд╢ рдХреЗ рдЬрд┐рддрдирд╛ рдХрд░реАрдм рд╣реЛ рд╕рдХреЗ рдЙрддрдиреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВредрд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЫрджреНрдо рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЗ рд╕рдореВрд╣ рд╕реЗ рдПрдХ рд╕реВрдЪреА рдмрдирд╛рдПрдБ: 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 : |
рд╣реБрд░реНрд░реЗ! рдЬреАрдд рдЧрдП рд╣реИрдВ!
рд▓реЗрдХрд┐рди рдпрд╣ рдХреЗрд╡рд▓ рддрднреА рдХрд╛рдо рдХрд░реЗрдЧрд╛ рдЬрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рд╢рд╛рдЦрд╛ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╣реЛрдЧрд╛редрдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
treeTakeDepth 4 (treeFromList [1..])
рдЕрдВрддрд╣реАрди рд░реВрдк рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛редрдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдб рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдкреНрд░рдореБрдЦ рдкрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИ filter (<1) [2..]
редрд▓реЗрдХрд┐рди filter
рдпрд╣ рд╕рдордЭрдиреЗ рдореЗрдВ рдЗрддрдирд╛ рд╕реНрдорд╛рд░реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдПрдХ рдЦрд╛рд▓реА рд╕реВрдЪреА рд╣реИредрд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдПрдХ рдЕрдЪреНрдЫрд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдХрд┐ рдЧреИрд░-рд╕рдЦреНрдд рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреНрдпрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВредрдкрд╛рдардХ рдХреЗ рд▓рд┐рдП рд╡реНрдпрд╛рдпрд╛рдо рдХрд░реЗрдВ:- рдРрд╕реА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЛ рд╕рд╛рдмрд┐рдд рдХрд░реЗрдВ
n
рдХрд┐ рдпрд╣ treeTakeDepth n (treeFromList shuffle)
рдПрдХ рдЕрдирдВрдд рд▓реВрдк рдореЗрдВ рдЖрддреА рд╣реИред - рдХреЗ рд▓рд┐рдП рдКрдкрд░реА рд╕реАрдорд╛ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдВ
n
ред - рд╕рд╛рдмрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдРрд╕реА рдХреЛрдИ
shuffle
рд╕реВрдЪреА рдирд╣реАрдВ рд╣реИ, рдЬрд┐рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдХреЗ, рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдЧрд╛ред
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
рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдпрд╣ рд╕рдВрд╕реНрдХрд░рдг рдЕрдЪреНрдЫрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ (рдореБрдЭреЗ рдкреВрд░реА рдЙрдореНрдореАрдж рд╣реИ) рдореВрд▓реНрдпреЛрдВ рдкрд░ рдПрдХ рдКрдкрд░реА рдФрд░ рдирд┐рдЪрд▓рд╛ рдмрд╛рдЙрдВрдб рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдПрдХ рдЕрдВрддрд╣реАрди рд▓реВрдк рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдлреЗрд░рдмрджрд▓ рдореЗрдВ рд╕реБрдзрд╛рд░ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИредрдХрдбрд╝рд╛рдИ рд╕реЗ рдмреЛрд▓рдиреЗ рдкрд░, рд╣рдо рдпрд╣ рдирд╣реАрдВ рдХрд╣ рд╕рдХрддреЗ рдХрд┐ рд╕реВрдЪреА рдЦрд╛рд▓реА рд╣реИ рдпрд╛ рдирд╣реАрдВ 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
редрдЖрдкрдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ рдЕрдореВрд▓реНрдп рд╣реИрдВредрд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдореИрдВ рдЕрдкрдиреЗ рдЕрдВрдЧреНрд░реЗрдЬреА рдкрд╛рда рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдореЗрдВ рдмрд┐рддрд╛рдП рд╕рдордп рдХреЗ рд▓рд┐рдП рдПрдХ рд╣рдЬрд╝рд╛рд░ рдмрд╛рд░ рдПрдордо рдХреЛ рдзрдиреНрдпрд╡рд╛рдж рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ ред рд╢реБрдХреНрд░рд┐рдпрд╛ рдпрд╛рд░ред