рдХреНрдпрд╛ рдЖрдкрдХреЛ рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рд╣реИ рдХрд┐ рдХрднреА-рдХрднреА рдЖрдкрдХреЛ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдХрд┐ рдПрдХ рдЕрдкрд░рд┐рдЪрд┐рдд рднрд╛рд╖рд╛ рдореЗрдВ рдХреЛрдб рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ? рдпрджрд┐ рднрд╛рд╖рд╛ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдЪреАрдЬрд╝реЛрдВ рдХреЗ рд╕рдорд╛рди рд╣реИ, рддреЛ рдЖрдк рдЖрдорддреМрд░ рдкрд░ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХреЛрдб рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ - рднрд▓реЗ рд╣реА рдЖрдк рднрд╛рд╖рд╛ рдХреА рд╕рднреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рди рд╣реЛрдВред
рд╣рд╛рд╕реНрдХреЗрд▓ рдХреЗ рд╕рд╛рде, рд╕рдм рдХреБрдЫ рдЕрд▓рдЧ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдкрд╛рд░рдВрдкрд░рд┐рдХ рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рджрд┐рдЦрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЕрдВрддрд░ рдЗрддрдирд╛ рдорд╣рд╛рди рдирд╣реАрдВ рд╣реИ - рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рд╕рд╣реА рдХреЛрдг рдкрд░ рджреЗрдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣рд╛рдБ рдПрдХ рддреНрд╡рд░рд┐рдд рд╣реИ, рдЕрдзрд┐рдХрд╛рдВрд╢ рднрд╛рдЧ рдХреЗ рд▓рд┐рдП рдЧрд▓рдд рд╣реИ, рдФрд░, рдЙрдореНрдореАрдж рд╣реИ, 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
рд░реИрдкрд┐рдВрдЧ
рдЖрдк рдПрдХ рд░реИрдкрд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЗрд╕ рддрдереНрдп рд╕реЗ рдЕрд▓рдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХрд┐рд╕рдХреЗ
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
ред рд╣рд╛рдБ рдирд░рдХред
рдЕрдиреБрд╡рд╛рджрдХ рд╕реЗ рдкреАрдкреАрдПрд╕: рдЧреНрд░реИрдирд┐рдирд╕ рдиреЗ рдХреБрдЫ рд╢рд░реНрддреЛрдВ рдХреЗ рдЕрдиреБрд╡рд╛рдж рдХреЗ рд╕рд╛рде рдореЗрд░реА рдорджрдж рдХреА