рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ (рдФрд░ рд╢реНрд░реЗрдгреА рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рдПрдХ рд╕рд╛) рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдореЛрдирд╛рдбреНрд╕

рдкрд░рд┐рдЪрдп


рдпрд╣ рдХреИрд╕реЗ рдкрддрд╛ рдХрд░реЗрдВ рдХрд┐ рдПрдХ рд╡реНрдпрдХреНрддрд┐ рд╕рдордЭ рдЧрдпрд╛ рдХрд┐ рдорда рдХреНрдпрд╛ рд╣реИрдВ? рд╡рд╣ рдЦреБрдж рдЖрдкрдХреЛ рд╕рдВрдЪрд╛рд░ рдХреЗ рдкрд╣рд▓реЗ 5 рдорд┐рдирдЯ рдореЗрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рдПрдЧрд╛ рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╕рдордЭрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдЧрд╛ред рд╡рд╣ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдкрд╛рда рднреА рд▓рд┐рдЦреЗрдВрдЧреЗ рдФрд░ рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ рддреЛ рдЗрд╕реЗ рдХрд╣реАрдВ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░реЗрдВ, рддрд╛рдХрд┐ рд╣рд░ рдХреЛрдИ рдпрд╣ рднреА рд╕рдордЭ рд╕рдХреЗ рдХрд┐ рдорда рдХреНрдпрд╛ рд╣реИрдВред


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


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


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


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



рд╢реНрд░реЗрдгреА


рдкрд░рд┐рднрд╛рд╖рд╛


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


рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдВрдХреЗрддрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:


  • рдУрдмреА рд╕реА - рд╢реНрд░реЗрдгреА рд╕реА рдХреА рд╡рд╕реНрддреБрдУрдВ;
  • рд╣реЛрдо рд╕реА (рдП, рдмреА) - рдП рд╕реЗ рдмреА рддрдХ рдЖрдХрд╛рд░рд┐рдХреА;
  • g and f рдЖрдХрд╛рд░ рдХреА рд╕рдВрд░рдЪрдирд╛ рд╣реИ f рдФрд░ gред

рдПрдХ рд╢реНрд░реЗрдгреА рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдореЗрдВ, рдЖрдХрд╛рд░рд┐рдХреА рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреЗ рдЕрдзреАрди рд╣реИрдВ:


  1. рдПрдл рдФрд░ рдЬреА рдХреА рдПрдХ рдЬреЛрдбрд╝реА рдХреЗ рд▓рд┐рдП, рдЕрдЧрд░ рдПрдл рдП рд╕реЗ рдмреА (рдПрдл (рд╣реЛрдо (рдП, рдмреА)) рд╕реЗ рдПрдХ рдЖрдХреГрддрд┐рд╡рд╛рдж рд╣реИ, рдЬреА рдмреА рд╕реЗ рд╕реА (рдЬреА (рд╣реЛрдо (рдмреА, рд╕реА)) рд╕реЗ рдПрдХ рдЖрдХреГрддрд┐рд╡рд╛рдж рд╣реИ, рддреЛ рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдЬреА a рдореМрдЬреВрдж рд╣реИ f A рд╕реЗ C рддрдХ рдХрд╛ рдЖрдХрд╛рд░рд┐рдХреА рд╣реИ (g тИИ f A рд╣реЛрдо (A, C))ред
  2. рдкреНрд░рддреНрдпреЗрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП, рдПрдХ рдкрд╣рдЪрд╛рди рдЖрдХрд╛рд░рд╡рд╛рдж рдЖрдИрдбреА рдП A рд╣реЛрдо (рдП, рдП) рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рджреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЧреБрдг рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдХрд┐рд╕реА рднреА рд╢реНрд░реЗрдгреА рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП (рд╢реНрд░реЗрдгреА рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЗ рд╕реНрд╡рдпрдВрд╕рд┐рджреНрдз):


  1. рд░рдЪрдирд╛ рдХреА рд╕рдВрдмрджреНрдзрддрд╛: рдПрдЪ тИШ (рдЬреА = рдПрдл) = (рдПрдЪ ivity рдЬреА); рдПрдл;
  2. рдкрд╣рдЪрд╛рди рдЖрдХреГрддрд┐ рд╡рд┐рдЬреНрдЮрд╛рди рдХреЗ рд╕рд╛рде рд░рдЪрдирд╛: рдпрджрд┐ 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.



, " " :


  1. h = g тИШ f, F h = F g тИШ F f.
  2. 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, "". , . , , , -, .

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


All Articles