рдЕрдЬрдЧрд░ рдХреИрд╕реЗ рд╣рд╛рд╕реНрдХреЗрд▓ рдкрдврд╝рддреЗ рд╣реИрдВ

рдХреНрдпрд╛ рдЖрдкрдХреЛ рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рд╣реИ рдХрд┐ рдХрднреА-рдХрднреА рдЖрдкрдХреЛ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдХрд┐ рдПрдХ рдЕрдкрд░рд┐рдЪрд┐рдд рднрд╛рд╖рд╛ рдореЗрдВ рдХреЛрдб рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ? рдпрджрд┐ рднрд╛рд╖рд╛ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдЪреАрдЬрд╝реЛрдВ рдХреЗ рд╕рдорд╛рди рд╣реИ, рддреЛ рдЖрдк рдЖрдорддреМрд░ рдкрд░ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХреЛрдб рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ - рднрд▓реЗ рд╣реА рдЖрдк рднрд╛рд╖рд╛ рдХреА рд╕рднреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рди рд╣реЛрдВред
рд╣рд╛рд╕реНрдХреЗрд▓ рдХреЗ рд╕рд╛рде, рд╕рдм рдХреБрдЫ рдЕрд▓рдЧ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкрд╛рд░рдВрдкрд░рд┐рдХ рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рджрд┐рдЦрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЕрдВрддрд░ рдЗрддрдирд╛ рдорд╣рд╛рди рдирд╣реАрдВ рд╣реИ - рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рд╕рд╣реА рдХреЛрдг рдкрд░ рджреЗрдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣рд╛рдБ рдПрдХ рддреНрд╡рд░рд┐рдд рд╣реИ, рдЕрдзрд┐рдХрд╛рдВрд╢ рднрд╛рдЧ рдХреЗ рд▓рд┐рдП рдЧрд▓рдд рд╣реИ, рдФрд░, рдЙрдореНрдореАрдж рд╣реИ, pythonists рджреНрд╡рд╛рд░рд╛ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рдорд╛рд░реНрдЧрджрд░реНрд╢рд┐рдХрд╛ ( рд▓реЗрдЦрдХ "рдкрд╛рдпрдереЛрдирд┐рд╕реНрдЯрд╛" рд╢рдмреНрдж рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ - рд▓рдЧрднрдЧред рдЕрдиреБрд╡рд╛рджрдХ ) рд╣рд╛рд╕реНрдХреЗрд▓ рдХреЛрдбред рдЕрдВрдд рддрдХ, рдЖрдк рдирд┐рдореНрди рдЯреБрдХрдбрд╝реЗ рдХреЛ рд╕рдордЭ рдкрд╛рдПрдВрдЧреЗ (рдХреЛрдб рдХрд╛ рднрд╛рдЧ рдПрд▓рд┐рдкреНрд╕ рдХреЗ рдмрд╛рдж рдЫреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ):
runCommand env cmd state = ... retrieveState = ... saveState state = ... main :: IO () main = do args <- getArgs let (actions, nonOptions, errors) = getOpt Permute options args opts <- foldl (>>=) (return startOptions) actions when (null nonOptions) $ printHelp >> throw NotEnoughArguments command <- fromError $ parseCommand nonOptions currentTerm <- getCurrentTerm let env = Environment { envCurrentTerm = currentTerm , envOpts = opts } saveState =<< runCommand env command =<< retrieveState 


рдкреНрд░рдХрд╛рд░


рдЙрд╕рдХреЗ рдмрд╛рдж рдЖрдиреЗ рд╡рд╛рд▓реА рд╣рд░ рдЪреАрдЬ рдХреЛ рдирдЬрд░рдЕрдВрджрд╛рдЬ type :: (рдФрд░ type , class , instance рдФрд░ newtype рднреА рдирдЬрд░рдЕрдВрджрд╛рдЬ type )ред рдХреБрдЫ рдХрд╕рдо рдЬреЛ рдЙрдиреНрд╣реЗрдВ рдХреЛрдб рдХреЛ рд╕рдордЭрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддреА рд╣реИрдВред рдпрджрд┐ рдЖрдк рдПрдХ рдкреВрд░реНрдг рд╢реБрд░реБрдЖрдд рд╣реИрдВ, рддреЛ Int рдФрд░ String рдЬреИрд╕реА LayoutClass рдорджрдж рдХрд░ рд╕рдХрддреА рд╣реИрдВ, рд▓реЗрдХрд┐рди LayoutClass рдФрд░ MonadError рдЬреИрд╕реА LayoutClass рдирд╣реАрдВ рд╣реИрдВред рдЙрдирдХреА рдЪрд┐рдВрддрд╛ рдордд рдХрд░реЛред

рдмрд╣рд╕


fabc f(a, b, c) ред рд╣рд╛рд╕реНрдХреЗрд▓ рдХреЛрд╖реНрдардХ рдФрд░ рдЕрд▓реНрдкрд╡рд┐рд░рд╛рдо рдХреЛ рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдПрдХ рдкрд░рд┐рдгрд╛рдо рдпрд╣ рд╣реИ рдХрд┐ рдХрднреА-рдХрднреА рд╣рдореЗрдВ рддрд░реНрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЛрд╖реНрдардХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ: fa (b1 + b2) c рдЕрдиреБрд╡рд╛рдж f(a, b1 + b2, c) ред

рдбреЙрд▓рд░ рдХрд╛ рдкреНрд░рддреАрдХ


рдЪреВрдБрдХрд┐ рд░реВрдк рдХреЗ рдЬрдЯрд┐рд▓ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпрд╛рдБ a + b рдХрд╛рдлреА рд╕рд╛рдорд╛рдиреНрдп рд╣реИрдВ, рдФрд░ Haskelers (Haskellers рд▓реЗрдЦрдХ - рдЕрдиреБрд╡рд╛рджрдХ рдХрд╛ рдиреЛрдЯ ) рдХреЛрд╖реНрдардХ рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдЙрдирд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдбреЙрд▓рд░ рдЪрд┐рдиреНрд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: f $ a + b f (a + b) рдмрд░рд╛рдмрд░ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред f(a + b) ред рдЖрдк $ рд╡рд┐рд╢рд╛рд▓рдХрд╛рдп рдмрд╛рдИрдВ рдХреЛрд╖реНрдардХ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдкрдВрдХреНрддрд┐ рдХреЗ рдЕрдВрдд рдореЗрдВ рдмрдВрдж рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ (рдФрд░ рдЕрдм рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ)))), рд╣реБрд░реНрд░реЗ!) рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдЖрдк рдЙрдиреНрд╣реЗрдВ рдШреЛрдВрд╕рд▓рд╛ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдПрдХ рдШреЛрдВрд╕рд▓реЗ рдХреЗ рд╕реНрддрд░ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдЧрд╛: f $ gx $ hy $ a + b , f (gx (hy (a + b))) рд╕рдорддреБрд▓реНрдп рд╣реИ рдФрд░ f(g(x,h(y,a + b)) (рд╣рд╛рд▓рд╛рдБрдХрд┐ рдХреБрдЫ рдЗрд╕реЗ рдмреБрд░рд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдорд╛рдирддреЗ рд╣реИрдВ)ред
рдХрднреА-рдХрднреА рдЖрдк рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ: <$> (рдХреЛрдг рдХреЛрд╖реНрдардХ рдХреЗ рд╕рд╛рде)ред рдЖрдк рдЗрд╕реЗ $ рдХреЗ рд╕рдорд╛рди рдорд╛рди рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рднреА рд╣реЛрддрд╛ рд╣реИ <*> - рдмрд╣рд╛рдирд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдЕрд▓реНрдкрд╡рд┐рд░рд╛рдо рд╣реИ, рдФрд░ f <$> a <*> b рдЕрдиреБрд╡рд╛рдж f(a, b) ред

рдЕрдкреНрд░реЛрд╕реНрдЯреНрд░реЛрдлрд┐рд╕ рдЙрд▓реНрдЯрд╛


x `f` y рдЕрдиреБрд╡рд╛рдж f(x,y) ред рдПрдкреЛрд╕реНрдЯреНрд░реЛрдлрд┐рд╕ рдХреЗ рдмреАрдЪ рдХрд╛ рдЯреБрдХрдбрд╝рд╛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ, рдЖрдорддреМрд░ рдкрд░ рджреНрд╡рд┐рдЖрдзрд╛рд░реА, рдФрд░ рджрд╛рдПрдВ рдФрд░ рдмрд╛рдПрдВ рддрд░реНрдХред

рдкреНрд░рддреАрдХ рдХреЗ рдмрд░рд╛рдмрд░


рджреЛ рдореВрд▓реНрдп рд╕рдВрднрд╡ рд╣реИрдВред рдХреЛрдб рдХреЗ рдПрдХ рдмреНрд▓реЙрдХ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдк рдХреЗрд╡рд▓ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:
 doThisThing abc = ... 
==>
 def doThisThing(a, b, c): ... 

рдХреАрд╡рд░реНрдб рдХреЗ рдЖрдЧреЗ, рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ:
 let a = b + c in ... 
==>
 a = b + c ... 


рдмрд╛рдг рдмрд╛рдг


рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:
 a <- createEntry x 
==>
 a = createEntry(x) 

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

рд╕рд╣реА рддреАрд░


рд╕рдм рдХреБрдЫ рдЬрдЯрд┐рд▓ рд╣реИред рд╣рдо рдмрд╛рдж рдореЗрдВ рдЙрдирдХреЗ рдкрд╛рд╕ рд▓реМрдЯ рдЖрдПрдВрдЧреЗред

рдХреАрд╡рд░реНрдб рдХрд░реЗрдВ


рд╢реЛрд░ред рдирдЬрд░рдЕрдВрджрд╛рдЬ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдХреБрдЫ рдЬрд╛рдирдХрд╛рд░реА рджреЗрддрд╛ рд╣реИ - рдХрд┐ рдиреАрдЪреЗ рджреБрд╖реНрдкреНрд░рднрд╛рд╡ рд╣реЛрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдЖрдк рдкрд╛рдпрдерди рдореЗрдВ рдЕрдВрддрд░ рдХрднреА рдирд╣реАрдВ рджреЗрдЦреЗрдВрдЧреЗред

рд╡рд╛рдкрд╕реА


рд╢реЛрд░ред рдЗрд╕реЗ рднреА рдирдЬрд░рдЕрдВрджрд╛рдЬ рдХрд░реЗрдВред (рдЖрдк рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП return рдХрднреА рдирд╣реАрдВ рджреЗрдЦреЗрдВрдЧреЗред)

рдмрд┐рдВрджреБ


f . g $ a + b f . g $ a + b рдЕрдиреБрд╡рд╛рдж f(g(a + b)) ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдкрд╛рдпрдерди рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ, рдЖрдкрдХреЛ рд╕рдВрднрд╡рддрдГ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬреИрд╕рд╛ рдХреБрдЫ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛:
 x = g(a + b) y = f(x) 
рд▓реЗрдХрд┐рди рд╣рд╛рд╕реНрдХреЗрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рдЪрд░ рд╕реЗ рдПрд▓рд░реНрдЬреА рд╣реИред

рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдСрдкрд░реЗрдЯрд░ рдФрд░ рдордЫрд▓реА


рдЖрдк =<< , >>= , <=< рдФрд░ >=> рдЬреИрд╕реА рдЪреАрдЬреЛрдВ рдХреЗ рд╕рд╛рде рдЖ рд╕рдХрддреЗ рд╣реИрдВред рдмрд╕, рдордзреНрдпрд╡рд░реНрддреА рдЪрд░ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреЗ рдХреБрдЫ рдФрд░ рддрд░реАрдХреЗ рд╣реИрдВ:
 doSomething >>= doSomethingElse >>= finishItUp 
==>
 x = doSomething() y = doSomethingElse(x) finishItUp(y) 

рдХрднреА-рдХрднреА рдПрдХ рд╣рд╛рд╕реНрдХреЗрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдпрд╣ рддрдп рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдЕрд▓рдЧ рджрд┐рд╢рд╛ рдореЗрдВ рдХрд░рдирд╛ рд╡рд┐рд╢реЗрд╖рдХрд░, рдЦрд╛рд╕рдХрд░ рдЕрдЧрд░ рдЪрд░ рдХреЛ рдХрд╣реАрдВ рдФрд░ рдорд╛рди рджрд┐рдпрд╛ рдЬрд╛рдП:
 z <- finishItUp =<< doSomethingElse =<< doSomething 
==>
 x = doSomething() y = doSomethingElse(x) z = finishItUp(y) 

рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ doSomething , doSomethingElse рдФрд░ finishItUp рдХреА рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреЛ doSomething рдЬреЛ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдЙрд╕рдХрд╛ рдЙрд▓реНрдЯрд╛ рдЗрдВрдЬреАрдирд┐рдпрд░рд┐рдВрдЧ рдХрд░рдирд╛ рд╣реИ: рдпрд╣ рдПрдХ рд╕рдВрдХреЗрдд рджреЗрдЧрд╛ рдХрд┐ "рдордЫрд▓реА" рдХреЛ "рдкреНрд░рд╡рд╛рд╣" рдЕрддреАрддред рдпрджрд┐ рдЖрдк рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк <=< рдФрд░ >=> рдЙрд╕реА рддрд░рд╣ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╡реЗ рдЬреИрд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреА рд░рдЪрдирд╛ рдХрд░рддреЗ рд╣реИрдВ)ред рдкрдврд╝реЗрдВ >> рдЕрд░реНрдзрд╡рд┐рд░рд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ (рдпрд╛рдиреА, рдХреЛрдИ рдХрд╛рдо рдирд╣реАрдВ):
 doSomething >> doSomethingElse 
==>
 doSomething() doSomethingElse() 


рдЖрдВрд╢рд┐рдХ рдЖрд╡реЗрджрди


рдХрднреА-рдХрднреА рд╣рд╛рд╕реНрдХреЗрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╣рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдкрд░реНрдпрд╛рдкреНрдд рддрд░реНрдХ рдкрд╛рд╕ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдбрд░реЛ рдордд, рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рдЙрдиреНрд╣реЛрдВрдиреЗ рдмрд╛рдХреА рддрд░реНрдХреЛрдВ рдХрд╛ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдХрд╣реАрдВ рдФрд░ рдЖрдпреЛрдЬрд┐рдд рдХрд┐рдпрд╛ред рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХреА рдЙрдкреЗрдХреНрд╖рд╛ рдХрд░реЗрдВ, рдпрд╛ рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХреА рддрд▓рд╛рд╢ рдХрд░реЗрдВ рдЬреЛ рдЕрдирд╛рдо рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрджрд┐рдЧреНрдз: map , fold (рдФрд░ рдЗрд╕рдХреЗ рдкреНрд░рдХрд╛рд░), filter , рд░рдЪрдирд╛ рдСрдкрд░реЗрдЯрд░ . , рдордЫрд▓реА рдСрдкрд░реЗрдЯрд░ ( =<< , рдЖрджрд┐)ред рдпрд╣ рдЕрдХреНрд╕рд░ рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рд╕рд╛рде рд╣реЛрддрд╛ рд╣реИ: (+3) lambda x: x + 3 рдЕрдиреБрд╡рд╛рдж рдХрд░рддрд╛ рд╣реИред

рдирд┐рдпрдВрддреНрд░рдг рдСрдкрд░реЗрдЯрд░реЛрдВ


рдкреНрд░рд╡реГрддреНрддрд┐ рдкрд░ рднрд░реЛрд╕рд╛: рдпреЗ рдСрдкрд░реЗрдЯрд░ рд╡рд╣реА рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдиреЗ рд╕реЛрдЪрд╛ рдерд╛! (рднрд▓реЗ рд╣реА рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдЙрд╕ рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП)ред рддреЛ, рдпрджрд┐ рдЖрдк рджреЗрдЦрддреЗ рд╣реИрдВ: when (x == y) $ doSomething x , рдкрдврд╝реЗрдВ рдХрд┐ "рдЪреВрдВрдХрд┐ x y рдмрд░рд╛рдмрд░ рд╣реИ, рддреЛ doSomething with рддрд░реНрдХ x " рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВред
рдЗрд╕ рддрдереНрдп рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░реЗрдВ рдХрд┐ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдХрд╛ рдЕрдиреБрд╡рд╛рдж when(x == y, doSomething(x)) (рдпрд╣рд╛рдБ doSomething рдХреЛ рд╡реИрд╕реЗ рднреА рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛) рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рджрд░рдЕрд╕рд▓, when(x == y, lambda: doSomething x) рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рднрд╛рд╖рд╛ рдирд┐рд░реНрдорд╛рдг рдХреЗ when рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
if рдФрд░ case рдХреАрд╡рд░реНрдб рд╣реИрдВред рд╡реЗ рдЙрдореНрдореАрдж рдХреЗ рдореБрддрд╛рдмрд┐рдХ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред

рд╕рд╣реА рддреАрд░ (рдЕрд╕рд▓реА рдХреЗ рд▓рд┐рдП!)


рджрд╛рдПрдВ рддреАрд░ рдХрд╛ рдмрд╛рдПрдВ рддреАрд░ рд╕реЗ рдХреЛрдИ рд▓реЗрдирд╛-рджреЗрдирд╛ рдирд╣реАрдВ рд╣реИред рдЙрдиреНрд╣реЗрдВ рдХреЙрд▓рди рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЛрдЪреЛ: рд╡реЗ рд╣рдореЗрд╢рд╛ case рдХреАрд╡рд░реНрдб рдФрд░ рдмреИрдХрд╕реНрд▓реИрд╢ рдХреЗ рдкрд╛рд╕ рдХрд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ (рдЬреЛ рд▓реИрдореНрдмрдбрд╛ рдШреЛрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ: \x -> x lambda x: x рдЕрдиреБрд╡рд╛рдж рдХрд░рддрд╛ рд╣реИ)ред
case рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдкреИрдЯрд░реНрди рдорд┐рд▓рд╛рди рдПрдХ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рд╕реБрд╡рд┐рдзрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ рдЗрд╕реЗ рд╕рдордЭрд╛рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред рд╢рд╛рдпрдж рд╕рдмрд╕реЗ рд╕рд░рд▓ if..elif..else рдХреЗ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рд╡рд╛рд▓реА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рджреЗрдЦреЗрдВ:
 case moose of Foo xyz -> x + y * z Bar z -> z * 3 
==>
 if isinstance(moose, Foo): x = moose.x # ! y = moose.y z = moose.z return x + y * z elif isinstance(moose, Bar): z = moose.z return z * 3 else: raise Exception("Pattern match failure!") 


рд░реИрдкрд┐рдВрдЧ


рдЖрдк рдПрдХ рд░реИрдкрд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЗрд╕ рддрдереНрдп рд╕реЗ рдЕрд▓рдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХрд┐рд╕рдХреЗ with рд╢реБрд░реВ рд╣реЛрддрд╛ with ред рд╡реЗ рдкрд╛рдпрдерди рдореЗрдВ рд╕рдВрджрд░реНрдн рдкреНрд░рдмрдВрдзрди рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ:
 withFile "foo.txt" ReadMode $ \h -> do ... 
==>
 with open("foo.txt", "r") as h: ... 

(рдЖрдк рдмреИрдХрд╕реНрд▓реИрд╢ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рдБ, рдпрд╣ рдПрдХ рдореЗрдордирд╛ рд╣реИред рд╣рд╛рдБ, withFile рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИред рд╣рд╛рдБ, рдЖрдк рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред)

рдЕрдкрд╡рд╛рдж


throw , catch , catch , throwIO , finally , handle рдФрд░ рдЕрдиреНрдп рд╕рднреА рд╕рдорд╛рди рдХрд╛рд░реНрдп рдареАрдХ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рдЖрдк рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВред рдпрд╣, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдордЬрд╝реЗрджрд╛рд░ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпреЗ рд╕рднреА рдХрд╛рд░реНрдп рд╣реИрдВ, рди рдХрд┐ рдХреАрд╡рд░реНрдб, рд╕рднреА рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рд╕рд╛рдеред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
 trySomething x `catch` \(e :: IOException) -> handleError e 
===
 catch (trySomething x) (\(e :: IOException) -> handleError e) 
==>
 try: trySomething(x) except IOError as e: handleError(e) 


рд╢рд╛рдпрдж


рдпрджрд┐ рдЖрдк Nothing рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕реЗ None ред рддреЛ isNothing x рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИ рдХрд┐ x is None ред рдХреБрдЫ рднреА рдирд╣реАрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд рдХреНрдпрд╛ рд╣реИ? Just ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, isJust x рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ x is not None ред
рдЖрдк рд╕рд╣реА рдХреНрд░рдо рдореЗрдВ Just рдФрд░ None рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╢реЛрд░ рдХрд╛ рдПрдХ рдмрд╣реБрдд рдХреБрдЫ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдЖрдо рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ:
 maybe someDefault (\x -> ...) mx 
==>
 if mx is None: x = someDefault else: x = mx ... 

рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд┐рдХрд▓реНрдк рд╣реИ рдЬрдм рдЕрд╢рдХреНрдд рддреНрд░реБрдЯрд┐ рд╣реИ:
 maybe (error "bad value!") (\x -> ...) x 
==>
 if x is None: raise Exception("bad value!") 


рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ


рдЙрдореНрдореАрдж рдХреЗ рдореБрддрд╛рдмрд┐рдХ рдХрд╛рдо рдХрд░реЗрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╣рд╛рд╕реНрдХреЗрд▓ рдЖрдкрдХреЛ рдмрд┐рдирд╛ рдирд╛рдо рдХреЗ рдХреНрд╖реЗрддреНрд░ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:
 data NoNames = NoNames Int Int data WithNames = WithNames { firstField :: Int, secondField :: Int } 

рдЗрд╕ рдкреНрд░рдХрд╛рд░, NoNames рдХреЛ NoNames (1, 2) рд░реВрдк рдореЗрдВ рдкрд╛рдпрдерди рдореЗрдВ NoNames рдЬрд╛рдПрдЧрд╛, рдФрд░ рдирд┐рдореНрди рд╡рд░реНрдЧ рдХреЗ WithNames :
 class WithNames: def __init__(self, firstField, secondField): self.firstField = firstField self.secondField = secondField 

рдЗрд╕ рд╕рд░рд▓ рддрд░реАрдХреЗ рд╕реЗ, NoNames 2 3 рдкреНрд░рд╕рд╛рд░рдг (2, 3) рдФрд░ WithNames 2 3 рдпрд╛ WithNames { firstField = 2, secondField = 3 } WithNames(2, 3) ред
рдлреАрд▓реНрдбреНрд╕ рдереЛрдбрд╝реЗ рдЕрд▓рдЧ рд╣реИрдВред рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рд╣рд╛рд╕реНрдХреЗрд▓рд░реНрд╕ рдиреЗ рдЕрдкрдиреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рдирд╛рдо рдЪрд░ рдХреЗ рд╕рд╛рдордиреЗ рд░рдЦреЗ рд╣реИрдВ, рдЬрдмрдХрд┐ рдЖрдкрдХреЛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдбрд╛рд▓рдиреЗ рдХреЗ рдмрд╛рдж рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рддреЛ field x рдЕрдиреБрд╡рд╛рдж x.field ред x.field = 2 рдХреИрд╕реЗ рд▓рд┐рдЦреЗрдВ? рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЖрдк рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдпрджреНрдпрдкрд┐ рдЖрдк рдХреЙрдкреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
 return $ x { field = 2 } 
==>
 y = copy(x) y.field = 2 return y 

рдпрд╛ рдЖрдк рд╕реНрдХреНрд░реИрдЪ рд╕реЗ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рдЖрдк x рдХреЛ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдирд╛рдо рд╕реЗ рдмрджрд▓рддреЗ рд╣реИрдВ (рдпрд╣ рдПрдХ рдмрдбрд╝реЗ рдЕрдХреНрд╖рд░ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ)ред рд╣рдо рдХреЗрд╡рд▓ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреА рдЕрдиреБрдорддрд┐ рдХреНрдпреЛрдВ рджреЗрддреЗ рд╣реИрдВ? рдХреНрдпреЛрдВрдХрд┐ рд╣рд╛рд╕реНрдХреЗрд▓ рдПрдХ рд╢реБрджреНрдз рднрд╛рд╖рд╛ рд╣реИ; рд▓реЗрдХрд┐рди рдЗрд╕ рдкрд░ рдзреНрдпрд╛рди рди рджреЗрдВред рдмрд╕ рдПрдХ рдФрд░ рд╣рд╛рд╕реНрдХреЗрд▓ рдХреНрд╡рд░реНрдХреАред

рд╕реВрдЪреА рдХреЗ рднрд╛рд╡


рд╢реБрд░реВ рдореЗрдВ, рд╡реЗ рдорд┐рд░рд╛рдВрдбрд╛-рд╣рд╛рд╕реНрдХреЗрд▓ рдкрд░рд┐рд╡рд╛рд░ рд╕реЗ рдЖрдП рдереЗ! рдЙрдирдХреЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рдХреБрдЫ рдФрд░ рдкрд╛рддреНрд░ рд╣реИрдВред
 [ x * y | x <- xs, y <- ys, y > 2 ] 
==>
 [ x * y for x in xs for y in ys if y > 2 ] 

рдпрд╣ рднреА рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рд╣рд╛рд╕реНрдХреЗрд▓рд░ рдЕрдХреНрд╕рд░ рдмрд╣реБ-рдкрдВрдХреНрддрд┐ рд░реВрдк рдореЗрдВ рд╕реВрдЪреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЛ рд▓рд┐рдЦрдирд╛ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ (рд╢рд╛рдпрдж рдЙрдиреНрд╣реЗрдВ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдкрдврд╝рдирд╛ рдЖрд╕рд╛рди рд▓рдЧрддрд╛ рд╣реИ)ред рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
 do x <- xs y <- ys guard (y > 2) return (x * y) 

рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдк рдПрдХ рдмрд╛рдпрд╛рдБ рддреАрд░ рджреЗрдЦрддреЗ рд╣реИрдВ рдФрд░ рдРрд╕рд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рддреГрддреАрдп-рдкрдХреНрд╖ рдкреНрд░рднрд╛рд╡ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╣реИрдВ, рддреЛ рдпрд╣ рд╕рдВрднрд╡рддрдГ рдПрдХ рд╕реВрдЪреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рд╣реИред

рдЕрдзрд┐рдХ рд╡рд░реНрдг


рд╕реВрдЪрд┐рдпрд╛рдБ рдареАрдХ рд╡реИрд╕реЗ рд╣реА рдХрд╛рдо рдХрд░рддреА рд╣реИрдВ рдЬреИрд╕реЗ рдЖрдк рдкрд╛рдпрдерди рдореЗрдВ рдХрд░рддреЗ рд╣реИрдВ: [1, 2, 3] - рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рддреАрди рддрддреНрд╡реЛрдВ рдХреА рд╕реВрдЪреАред рдмреГрд╣рджрд╛рдиреНрддреНрд░, рдЬреИрд╕рд╛ рдХрд┐ x:xs , рдХрд╛ рдЕрд░реНрде рд╣реИ рдЕрдВрдд рдореЗрдВ x рд╕рд╛рде рдПрдХ рд╕реВрдЪреА рдмрдирд╛рдирд╛ рдФрд░ рдЕрдВрдд рдореЗрдВ xs (рд▓рд┐рд╢ рдкреНрд░рд╢рдВрд╕рдХреЛрдВ рдХреЗ рд▓рд┐рдП ()ред) ++ - рд╕реВрдЪреА рд╕рдВрдШрдЯрди, !! - рд╕реВрдЪрдХрд╛рдВрдХ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдЪрд╛рд░ред рдмреИрдХрд╕реНрд▓реИрд╢ рдХрд╛ рдЕрд░реНрде рд╣реИ lambda ред рдпрджрд┐ рдЖрдкрдХреЛ рдХреЛрдИ рдРрд╕рд╛ рдЪрд░рд┐рддреНрд░ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдЖрдк рдирд╣реАрдВ рд╕рдордЭрддреЗ рд╣реИрдВ, рддреЛ Hoogle рдореЗрдВ рдЦреЛрдЬ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ (рд╣рд╛рдБ, рдпрд╣ рдкрд╛рддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ!)ред

рдЕрдзрд┐рдХ рд╢реЛрд░


рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдпреЛрдВ, рд╕рдВрднрд╡рддрдГ рд╢реЛрд░, рдФрд░ рд╕рдВрднрд╡рддрдГ рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: liftIO , lift , runX (рдЬреИрд╕реЗ runState ), unX (рдЬреИрд╕реЗ unConstructor ) , fromJust , fmap , const , рд╕реЗ evaluate , рддрд░реНрдХ рд╕реЗ рдкрд╣рд▓реЗ рд╡рд┐рд╕реНрдордп рдмреЛрдзрдХ рдЪрд┐рд╣реНрди ( f !x ) f !x , seq , seq рдкреНрд░рддреАрдХ (рдЬреИрд╕реЗ I# x )ред

рдпрд╣ рд╕рдм рдПрдХ рд╕рд╛рде рд░рдЦрдирд╛


рдЖрдЗрдП рдореВрд▓ рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВ:
 runCommand env cmd state = ... retrieveState = ... saveState state = ... main :: IO () main = do args <- getArgs let (actions, nonOptions, errors) = getOpt Permute options args opts <- foldl (>>=) (return startOptions) actions when (null nonOptions) $ printHelp >> throw NotEnoughArguments command <- fromError $ parseCommand nonOptions currentTerm <- getCurrentTerm let env = Environment { envCurrentTerm = currentTerm , envOpts = opts } saveState =<< runCommand env command =<< retrieveState 


рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЗрд╕ рдЕрдиреБрд╡рд╛рдж рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
 def runCommand(env, cmd, state): ... def retrieveState(): ... def saveState(state): ... def main(): args = getArgs() (actions, nonOptions, errors) = getOpt(Permute(), options, args) opts = **mumble** if nonOptions is None: printHelp() raise NotEnoughArguments command = parseCommand(nonOptions) currentTerm = getCurrentTerm() env = Environment(envCurrentTerm=currentTerm, envOpts=opts) state = retrieveState() result = runCommand(env, command, state) saveState(result) 

рд╣рд╛рд╕реНрдХреЗрд▓ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреА рд╕рддрд╣реА рд╕рдордЭ рдХреЗ рд▓рд┐рдП рдпрд╣ рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реИ (рдПрдХ рдЯреБрдХрдбрд╝рд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╕реНрдкрд╖реНрдЯ рддрд░реАрдХреЗ рд╕реЗ рдЕрдиреБрд╡рд╛рджрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдЗрд╕ рдмрд╛рдд рдХрд╛ рдЬреНрдЮрд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╕рдЬрд╛ рдХреНрдпрд╛ рд╣реИ ( рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдкрд╛рдпрдерди рдореЗрдВ рдПрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХрдореА рдлрд╝рдВрдХреНрд╢рди рд╣реИ - рдЕрдиреБрд╡рд╛рджрдХ рдЯрд┐рдкреНрдкрдгреА )ред рдирд╣реАрдВ рд╣рд╛рд╕реНрдХреЗрд▓ рдХреЛрдб рджреГрдврд╝ рд╕рдВрдХрд▓реНрдк рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ; рдореИрдВ рджреЛрд╣рд░рд╛рддрд╛ рд╣реВрдВ; рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдЪрд┐рдВрддрд╛ рд╣реИ!
рдЬреНрдпрд╛рджрд╛рддрд░ рдЪреАрдЬреЗрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдореИрдВрдиреЗ "рд╢реЛрд░" рдХрд╣рд╛ рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЙрдирдХреЗ рдкреАрдЫреЗ рдмрд╣реБрдд рдЧрд╣рд░реЗ рдХрд╛рд░рдг рд╣реИрдВ, рдФрд░ рдпрджрд┐ рдЖрдк рдЙрдирдХреЗ рдкреАрдЫреЗ рдХреНрдпрд╛ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдореИрдВ рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рд▓рд┐рдЦрдирд╛ рд╕реАрдЦрдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рд╕рд┐рд░реНрдл рдкрдврд╝ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпреЗ рдирд┐рдпрдо, рдкрд░реНрдпрд╛рдкреНрдд рд╕реЗ рдЕрдзрд┐рдХ рд╣реИрдВред
рдкреБрдирд╢реНрдЪ рдпрджрд┐ рдЖрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рдмрд╛рдд рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ рдХрд┐ рдХрд┐рд╕ foldl (>>=) (return startOptions) action : рдпрд╣ рдХрд░реНрддрд╡реНрдпреЛрдВ рдХреЗ рдкреИрдЯрд░реНрди рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЛ рд▓рд╛рдЧреВ foldl (>>=) (return startOptions) action ред рд╣рд╛рдБ рдирд░рдХред

рдЕрдиреБрд╡рд╛рджрдХ рд╕реЗ рдкреАрдкреАрдПрд╕: рдЧреНрд░реИрдирд┐рдирд╕ рдиреЗ рдХреБрдЫ рд╢рд░реНрддреЛрдВ рдХреЗ рдЕрдиреБрд╡рд╛рдж рдХреЗ рд╕рд╛рде рдореЗрд░реА рдорджрдж рдХреА

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


All Articles