рдкрд░рд┐рдЪрдп
рдпрд╣ рдХреИрд╕реЗ рдкрддрд╛ рдХрд░реЗрдВ рдХрд┐ рдПрдХ рд╡реНрдпрдХреНрддрд┐ рд╕рдордЭ рдЧрдпрд╛ рдХрд┐ рдорда рдХреНрдпрд╛ рд╣реИрдВ? рд╡рд╣ рдЦреБрдж рдЖрдкрдХреЛ рд╕рдВрдЪрд╛рд░ рдХреЗ рдкрд╣рд▓реЗ 5 рдорд┐рдирдЯ рдореЗрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдПрдЧрд╛ рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕рдордЭрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдЧрд╛ред рд╡рд╣ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдкрд╛рда рднреА рд▓рд┐рдЦреЗрдВрдЧреЗ рдФрд░ рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ рддреЛ рдЗрд╕реЗ рдХрд╣реАрдВ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░реЗрдВ, рддрд╛рдХрд┐ рд╣рд░ рдХреЛрдИ рдпрд╣ рднреА рд╕рдордЭ рд╕рдХреЗ рдХрд┐ рдорда рдХреНрдпрд╛ рд╣реИрдВред
рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рдмреАрдЪ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╣рд╛рд╕реНрдХреЗрд▓ рдкрд░, рдПрдХ рд╕реНрдерд╛рдиреАрдп рдореЗрдо рдХрд╛ рдПрдХ рд╕рд╛ рдмрди рдЧрдпрд╛ рд╣реИред рдЙрдиреНрд╣реЗрдВ рдЕрдХреНрд╕рд░ рд╕рдордЭрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИ, рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЛрдВ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреА рд╣реИ рдФрд░ рддреБрд░рдВрдд рдЙрдкрдпреЛрдЧ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рджреЗрддреА рд╣реИред рдЗрд╕ рд╡рдЬрд╣ рд╕реЗ, рд╢реНрд░реЛрддрд╛ рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЗ рдореБрдЦреНрдп рд╕рд╛рд░ рдХреЛ рд╕рдордЭ рдирд╣реАрдВ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рднрд┐рдХреНрд╖реБрдУрдВ рдХреЛ рдХрд╛рд▓реЗ рдЬрд╛рджреВ, рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ, рдпрд╛ рдХреЗрд╡рд▓ рд╡рд┐рд╢реБрджреНрдз рд░реВрдк рд╕реЗ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯ рдХреЛ рдХреБрдЪрд▓рдиреЗ рдХрд╛ рдПрдХ рд╕рд╛рдзрди рдмрдирд╛ рд░рд╣реЗрдЧрд╛ред
рдореИрдВ рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рд╢реНрд░реЗрдгреА рд╕рд┐рджреНрдзрд╛рдВрдд рдХреА рдореВрд▓ рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдКрдВрдЧрд╛, рдФрд░ рдлрд┐рд░ рдПрдХ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рд╣рдо рдПрдХ рд╕рдиреНрдпрд╛рд╕реА рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдкрд░ рдкрд╣реБрдВрдЪреЗрдВрдЧреЗ рдФрд░ рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╣реБрдд рд╕реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдЕрдкрдиреА рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдореЗрдВ рдЗрд╕ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдЕрдореВрд░реНрддрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
рдореЗрд░реА рдкреНрд░рд╕реНрддреБрддрд┐ рдХрд╛рдлреА рд╣рдж рддрдХ рдмрд╛рд░реНрдЯреЛрдЬрд╝ рдорд┐рд▓реНрд╡рд┐рдХ рдХреА рдкреБрд╕реНрддрдХ, рд╢реНрд░реЗрдгреА рдереНрдпреЛрд░реА рдлреЙрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░реНрд╕ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рдЬреЛ рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рдИ рдЧрдИ рдереА, рдкреАрдбреАрдПрдл рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИ, рдФрд░ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдХрд╛рдЧрдЬ рдореЗрдВ рдкреНрд░рдХрд╛рд╢рд┐рдд рд╣реБрдИ рд╣реИред
рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рдЙрджрд╛рд╣рд░рдг рджрд┐рдП рдЧрдП рд╣реИрдВ, рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдкрд╛рдардХ рднрд╛рд╖рд╛ рдХреА рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдФрд░ рдмреБрдирд┐рдпрд╛рджреА рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИред рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдкреБрд╕реНрддрдХ рдореЗрдВ C ++ рдореЗрдВ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ, рдЖрдк рдХреЛрдб рдХреА рд╢реБрджреНрдзрддрд╛ рдФрд░ рд╕рдордЭ рдХреА рддреБрд▓рдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд╢реНрд░реЗрдгреА
рдкрд░рд┐рднрд╛рд╖рд╛
рд╢реНрд░реЗрдгрд┐рдпрд╛рдВ рд╕реНрд╡рдпрдВ рдмрд╣реБрдд рд╕рд░рд▓ рдирд┐рд░реНрдорд╛рдг рд╣реИрдВред рдПрдХ рд╢реНрд░реЗрдгреА рд╡рд╕реНрддреБрдУрдВ рдФрд░ рдЙрдирдХреЗ рдмреАрдЪ рдЖрдХрд╛рд░рд┐рдХреА рдХрд╛ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рд╣реИред рдЖрдХреГрддрд┐ рд╡рд┐рдЬреНрдЮрд╛рди рдХреЛ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рд╡рд╛рд▓реЗ рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рддреАрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЗ рдореЗрдВ, рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдЬреНрдЮрд╛рдд рдирд╣реАрдВ рд╣реИред рд╢реНрд░реЗрдгреА рд╕рд┐рджреНрдзрд╛рдВрдд рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдХреГрддрд┐ рд╡рд┐рдЬреНрдЮрд╛рди рдХреЗ рд╕рд╛рде, рдпрд╛ рдмрд▓реНрдХрд┐, рдЙрдирдХреА рд░рдЪрдирд╛ рдХреЗ рд╕рд╛рдеред
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдВрдХреЗрддрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
- рдУрдмреА рд╕реА - рд╢реНрд░реЗрдгреА рд╕реА рдХреА рд╡рд╕реНрддреБрдУрдВ;
- рд╣реЛрдо рд╕реА (рдП, рдмреА) - рдП рд╕реЗ рдмреА рддрдХ рдЖрдХрд╛рд░рд┐рдХреА;
- g and f рдЖрдХрд╛рд░ рдХреА рд╕рдВрд░рдЪрдирд╛ рд╣реИ f рдФрд░ gред
рдПрдХ рд╢реНрд░реЗрдгреА рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдореЗрдВ, рдЖрдХрд╛рд░рд┐рдХреА рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреЗ рдЕрдзреАрди рд╣реИрдВ:
- рдПрдл рдФрд░ рдЬреА рдХреА рдПрдХ рдЬреЛрдбрд╝реА рдХреЗ рд▓рд┐рдП, рдЕрдЧрд░ рдПрдл рдП рд╕реЗ рдмреА (рдПрдл (рд╣реЛрдо (рдП, рдмреА)) рд╕реЗ рдПрдХ рдЖрдХреГрддрд┐рд╡рд╛рдж рд╣реИ, рдЬреА рдмреА рд╕реЗ рд╕реА (рдЬреА (рд╣реЛрдо (рдмреА, рд╕реА)) рд╕реЗ рдПрдХ рдЖрдХреГрддрд┐рд╡рд╛рдж рд╣реИ, рддреЛ рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдЬреА a рдореМрдЬреВрдж рд╣реИ f A рд╕реЗ C рддрдХ рдХрд╛ рдЖрдХрд╛рд░рд┐рдХреА рд╣реИ (g тИИ f A рд╣реЛрдо (A, C))ред
- рдкреНрд░рддреНрдпреЗрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП, рдПрдХ рдкрд╣рдЪрд╛рди рдЖрдХрд╛рд░рд╡рд╛рдж рдЖрдИрдбреА рдП A рд╣реЛрдо (рдП, рдП) рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рджреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЧреБрдг рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдХрд┐рд╕реА рднреА рд╢реНрд░реЗрдгреА рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП (рд╢реНрд░реЗрдгреА рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЗ рд╕реНрд╡рдпрдВрд╕рд┐рджреНрдз):
- рд░рдЪрдирд╛ рдХреА рд╕рдВрдмрджреНрдзрддрд╛: рдПрдЪ тИШ (рдЬреА = рдПрдл) = (рдПрдЪ ivity рдЬреА); рдПрдл;
- рдкрд╣рдЪрд╛рди рдЖрдХреГрддрд┐ рд╡рд┐рдЬреНрдЮрд╛рди рдХреЗ рд╕рд╛рде рд░рдЪрдирд╛: рдпрджрд┐ f the рд╣реЛрдо (рдП, рдмреА), рддреЛ рдПрдл identity рдЖрдИрдбреА рдП = рдЖрдИрдбреА рдмреА ред рдПрдл = рдПрдлред
рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдХреЛ рдмрд╣реБрдд рдЖрд╕рд╛рдиреА рд╕реЗ рдФрд░ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджреЗрд╢рд┐рдд рд░реЗрдЦрд╛рдВрдХрди рдХреЗ рд░реВрдк рдореЗрдВ рдХрд▓реНрдкрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдХрд┐рд╕реА рднреА рдЙрдиреНрдореБрдЦ рдЧреНрд░рд╛рдл рдХреЛ рдЖрдХрд╛рд░рд┐рдХреА рдФрд░ рд╕рдорд╛рди рдЖрдХрд╛рд░ рдХреА рд░рдЪрдирд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рдХрд░ рдПрдХ рд╢реНрд░реЗрдгреА рдореЗрдВ рдмрдврд╝рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдХрд┐рд╕реА рднреА рд╢реНрд░реЗрдгреА рдХреЗ рд▓рд┐рдП, рдЖрдк рдПрдХ рджреЛрд╣рд░реА рд╢реНрд░реЗрдгреА рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ( рд╕реА рдСрдк рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реВрдкрд┐рдд, рдЬрд┐рд╕рдореЗрдВ рдореВрд▓ рд╢реНрд░реЗрдгреА рдХреЗ рддреАрд░реЛрдВ рдХреЛ рдореЛрдбрд╝рдХрд░ рдЖрдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕рдорд╛рди рд╣реЛрддреЗ рд╣реИрдВред рдпрд╣ рд╣рдореЗрдВ рджреЛрд╣рд░реЗ рд╡рд┐рд╡рд░рдг рдФрд░ рд╕рд┐рджреНрдзрд╛рдВрдд рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рддреАрд░ рдЙрд▓реНрдЯреЗ рд╣реЛрдиреЗ рдкрд░ рд╕рддреНрдп рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИред
рдСрдмреНрдЬреЗрдХреНрдЯ рдФрд░ рдореЙрд░реНрдлрд┐рдЬреНрдо рдЖрд╡рд╢реНрдпрдХ рд░реВрдк рд╕реЗ рд╕реЗрдЯ (рд╢рд╛рд╕реНрддреНрд░реАрдп рдЕрд░реНрде рдореЗрдВ, рд╕реЗрдЯ рд╕рд┐рджреНрдзрд╛рдВрдд рд╕реЗ) рдирд╣реАрдВ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП, рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╡рд╛рдХреНрдпрд╛рдВрд╢ "рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рд╡рд░реНрдЧ" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬрд┐рди рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдФрд░ рдЖрдХрд╛рд░рд┐рдХреА рдХреЗ рд╡рд░реНрдЧ рдЕрднреА рднреА рд╕реЗрдЯ рд╣реИрдВ рдЙрдиреНрд╣реЗрдВ рдЫреЛрдЯреА рд╢реНрд░реЗрдгреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдЧреЗ рд╣рдо рдХреЗрд╡рд▓ рдЙрдирдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВрдЧреЗред
рдкреНрд░рдХрд╛рд░ рдФрд░ рдХрд╛рд░реНрдп
, Haskell, тАФ . , Int
Bool
тАФ , Int -> Bool
тАФ .
id
, :
id :: a -> a
id x = x
тАФ , Haskell :
f :: a -> b
g :: b -> c
g . f :: a -> c
(g . f) x = g (f x)
, , тАФ , Set. , тАФ , : . bottom, _|_
. , , , bottom. Haskell, , Hask. , Set. , , : HomC(A, B) тИИ C. , a -> b
тАФ Haskell.
.
Void
, ( ). absurd
, , , Void
, :
absurd :: Void -> a
Unit
, тАФ , ()
. unit
, :
unit :: a -> Unit
unit _ = ()
тАФ Bool
:
data Bool = True | False
, Void
, Unit
Bool
.
Void
, absurd
, Bool
, Unit
. , Void
, , .
Bool -> Unit
, unit
, . Unit -> Bool
. ()
, True
, False
. , Unit
Bool
:
true, false :: a -> Bool
true _ = True
false _ = False
Bool
Bool
тАФ , 4 ( n тАФ 22n): id
, true
false
, , not
:
not :: Bool -> Bool
not True = False
not False = True
, :

Haskell- .
тАФ . , C D, F . -, C D. a тАФ C, F a тАФ D, . -, : f :: a -> b
C F f :: F a -> F b
D.

, " " :
- h = g тИШ f, F h = F g тИШ F f.
- ida тАФ a, F ida = idF a тАФ F a.
, "" : , , . , , () . , .
. , F :: C -> D
G :: D -> E
G . F :: C -> E
. , , , , . IdC, IdD IdE. , , .

, , -, тАФ (). , Cat ( ).
Haskell . , , - , .
Maybe
, a
Maybe a
( Maybe
!):
data Maybe a = Nothing | Just a
, f :: a -> b
F f :: Maybe a -> Maybe b
. fmap
. , ( ):
-- f F f
-- /------\ /------------------\
fmap :: (a -> b) -> (Maybe a -> Maybe b)
fmap _ Nothing = Nothing
fmap f (Just x) = Just (f x)
, Maybe
тАФ . , , Functor
. fmap
, , ( тАФ ):
class Functor f where
fmap :: (a -> b) -> f a -> f b
тАФ , , fmap
. f a -> f b
, , .
, , , .. , . : , - .
. , . , , тАФ Haskell.
: upCase
, , toWords
, . toUpper
words
:
upCase :: String -> String
upCase = map toUpper
toWords :: String -> [String]
toWords = words
:
processString :: String -> [String]
processString = toWords . upCase
, . , processString
"upCase toWords".
тАФ , . -, , , -, , .
, a
, .
newtype Writer a = Writer (a, String)
, Writer
тАФ , fmap
:
instance Functor Writer where
fmap f (Writer (x, s)) = Writer (f x, s)
upCase
toWords
, , "" Writer
:
upCase :: String -> Writer String
upCase s = Writer (map toUpper s, "upCase ")
toWords :: String -> Writer [String]
toWords s = Writer (words s, "toWords ")
, , - . , b
, , c
c
, :
compose :: (a -> Writer b) -> (b -> Writer c) -> (a -> Writer c)
compose f g = \x -> let Writer (y, s1) = f x
Writer (z, s2) = g y
in Writer (z, s1 ++ s2)
processString
:
processString :: String -> [String]
processString = compose upCase toWords
. () a -> b
a -> Writer b
, a
b
. , .. a -> Writer a
:
writerId :: a -> Writer a
writerId x = Writer (x, "")
, , Hask. , a
b
a -> b
, a -> m b
, .. "" - m
. (embellished). m
, Writer
тАФ .
C m. K, , C, .. ObK = ObC. a -> b
K a -> m b
C: HomK(a, b) = HomC(a, m b). , , K тАФ C.
, , , . , m тАФ . Haskell ( Hask):
class Monad m where
--
(>=>) :: (a -> m b) -> (b -> m c) -> (a -> m c)
--
return :: a -> m a
>=>
, "fish", : . , , тАФ , , , . Writer
тАФ , compose
тАФ >=>
, writerId
тАФ return
.
>=>
. , -. a
, f
, , , bind
:
f >=> g = \a -> let mb = f a
in (bind mb g)
where
bind :: m b -> (b -> m c) -> m c
bind
b
" " m
, b
m c
. >=>
. : m b -> (b -> m c) -> m c
. , . "" Haskell >>=
, bind
, return
:
class Monad m where
(>>=) :: m a -> (a -> m b) -> m b
return :: a -> m a
, - b -> m c
b
, m b
. , m
, fmap
, (a -> m b) -> m a -> m (m b)
. >>=
m (m b)
m b
, "" , . join
:
ma >>= g = join (fmap g ma)
where
join :: m (m a) -> m a
, Writer
:
join :: Writer (Writer a) -> Writer a
join (Writer ((Writer (x, s2)), s1)) = Writer (x, s1 ++ s2)
Monad
:
class Functor m => Monad m where
join :: m (m a) -> m a
return :: a -> m a
, m
. , fmap
>>=
:
fmap :: (a -> b) -> m a -> m b
fmap f ma = ma >>= (\a -> return (f a))
, "" .
(.. , ) .
(a -> [b]) -> (b -> [c]) -> (a -> [c])
. :
(>=>) :: (a -> [b]) -> (b -> [c]) -> (a -> [c])
f >=> g = \x -> concat (map g (f x))
. a
, , тАФ f
[b]
. , b
тАФ g
: map g (f x) :: [[c]]
. , .
>>=
:
(>>=) :: [a] -> (a -> [b]) -> [b]
xs >>= f = concat (map f xs)
return :: a -> [a]
. :
return :: a -> [a]
return x = [x]
Monad
:
instance Monad [] where
xs >>= f = concat (map f xs)
return x = [x]
, . , , . , тАФ , ..
, , - .
, , Maybe
. Just
, тАФ Nothing
. , , :
(>=>) :: (a -> Maybe b) -> (b -> Maybe c) -> (a -> Maybe c)
f >=> g = \x -> case f x of
Just y -> g y
Nothing -> Nothing
Monad
Maybe
:
instance Monad Maybe where
(Just x) >>= f = f x
Nothing >>= f = Nothing
return x = Just x
, . , - , , - . Either String a
, : , . :
data Either a b = Left a | Right b
, . . :
type WithException a = Either String a
Maybe
:
(>=>) :: (a -> WithException b) -> (b -> WithException c) -> (a -> WithException c)
f >=> g = \x -> case f x of
Right y -> g y
err -> err
Monad
:
instance Monad WithException where
(Right x) >>= f = f x
err >>= f = err
return x = Right x
, , write-only , . a -> b
, , . , , ( , ):
a -> s -> (b, s)
:
newtype State s a = State (s -> (a, s))
s
, State s
. runState
:
runState :: State s a -> s -> (a, s)
runState (State f) s = f s
Functor
:
instance Functor (State s) where
fmap f state = State st'
where
st' prevState = let (a, newState) = runState state prevState
in (f a, newState)
, a
b
, , a -> State s b
, State s
тАФ . , :
(>=>) :: (a -> State s b) -> (b -> State s c) -> (a -> State s c)
f >=> g = \x -> State (\s -> let (y, s') = runState (f x) s
in runState (g y) s')
Monad
. , return
, , -:
instance Monad (State s) where
stateA >>= f = State (\s -> let (a, s') = runState stateA s
in runState (f a) s')
return a = State (\s -> (a, s))
, . , Unit
s
, Unit -> State s s
:
get :: Unit -> State s s
get _ = State (\s -> (s, s))
, Unit
. , .
, , . , , , s
Unit
, s -> State s Unit
:
put :: s -> State s Unit
put s = State (\_ -> ((), s))
, , /. , " " RealWorld
, . RealWorld
- , (, ). :
type IO a = State RealWorld a
IO
тАФ , Haskell, "". , . , , , -, .