рдЧреБрдб рдХреЗ рд▓рд┐рдП рд╣рд╛рд╕реНрдХреЗрд▓ рдХрд╛ рдЕрдиреНрд╡реЗрд╖рдг рдХрд░реЗрдВ! рдПрдкреНрд▓рд╛рдЗрдб рдлрдВрдХреНрд╢рдирд▓рд░реНрд╕

рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рдиреЛ рд╕реНрдЯрд╛рд░реНрдЪ рдкреНрд░реЗрд╕ рдиреЗ рдЧреНрд░реЗрдЯ рд▓реБрдХ рдХреЗ рд▓рд┐рдП рдЙрддреНрдХреГрд╖реНрдЯ рд▓рд░реНрди рдпреВ рд╣рд╛рд╕реНрдХреЗрд▓ рдХреЗ рдПрдХ рдореБрджреНрд░рд┐рдд рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрддреНрдкрд╛рджрди рдФрд░ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдпрд╛ рд╣реИ ! (рдСрдирд▓рд╛рдЗрди рд╕рдВрд╕реНрдХрд░рдг) рдореАрд░рд╛рди рд▓рд┐рдкреЛрд╡рд╛ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦрд┐рддред

рдореИрдВ рдЖрдкрдХреЛ рдЕрдзреНрдпрд╛рдп 11 рдХрд╛ рд╕рдмрд╕реЗ рд╡рд░реНрддрдорд╛рди рдЕрдиреБрд╡рд╛рдж рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдореВрд▓, рдХреЛрдИ рд╕реНрдЯрд╛рд░реНрдЪ рдкреНрд░реЗрд╕ рд╕реЗ рдкреНрд░рдХрд╛рд╢рди, рдореБрджреНрд░рдг рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рддред

рдПрдкреНрд▓рд╛рдЗрдб рдлрдВрдХреНрд╢рдирд▓рд░реНрд╕


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

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

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

рдлрд╝рдирдХрд╛рд░ рд▓реМрдЯ рдЖрддреЗ рд╣реИрдВ



рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рдЕрдзреНрдпрд╛рдп 7 рдореЗрдВ рд╕реАрдЦрд╛, рдлрдВрдХреНрд╢рдирд▓рд░реНрд╕ рдРрд╕реА рдЗрдХрд╛рдЗрдпрд╛рдБ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕реЗ рд╕реВрдЪрд┐рдпрд╛рдБ, Maybe рдорд╛рди рдФрд░ рдкреЗрдбрд╝ред рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ, рдЙрдиреНрд╣реЗрдВ Functor рдЯрд╛рдЗрдк рдХреНрд▓рд╛рд╕ рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреА рдХреНрд▓рд╛рд╕ рд╡рд┐рдзрд┐ рд╣реЛрддреА рд╣реИ: fmap ред fmap рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реЛрддрд╛ рд╣реИ fmap :: (a -> b) -> fa -> fb , рдЬреЛ рдХрд╣рддрд╛ рд╣реИ, "рдореБрдЭреЗ рдПрдХ рдлрдВрдХреНрд╢рди рджреАрдЬрд┐рдП рдЬреЛ a рдФрд░ рд░рд┐рдЯрд░реНрди b рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдПрдХ рдмреЙрдХреНрд╕ (рдпрд╛ рдХрдИ a) рдЕрдВрджрд░ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдореИрдВ рдмреЙрдХреНрд╕ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░реВрдБрдЧрд╛ b (рдпрд╛ рдХреБрдЫ b ) рдЕрдВрджрд░ред "рдпрд╣ рдмреЙрдХреНрд╕ рдХреЗ рдЕрдВрджрд░ рдПрдХ рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред

рд╣рдо рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрджрд░реНрдн рдХреЗ рд╕рд╛рде рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдлрдВрдХреНрд╢рдирд▓рд░реНрд╕ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рднреА рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Maybe рдорд╛рдиреЛрдВ рдХрд╛ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрджрд░реНрдн рд╣реЛ, рдкрд░рд┐рдХрд▓рди рд╡рд┐рдлрд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, рд╕рдВрджрд░реНрдн рдпрд╣ рд╣реИ рдХрд┐ рдорд╛рди рдХрдИ рдпрд╛ рдЕрдиреБрдкрд╕реНрдерд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред fmap рдЕрдкрдиреЗ рд╕рдВрджрд░реНрдн рдХреЛ рдмрдирд╛рдП рд░рдЦрддреЗ рд╣реБрдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдПрдХ рдореВрд▓реНрдп рдкрд░ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред

рдпрджрд┐ рд╣рдо рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ Functor рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдлреЙрд░реНрдо * -> * рдХрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рдПрдХ рдареЛрд╕ рдкреНрд░рдХрд╛рд░ рд▓реЗрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Maybe рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрддреНрдкрд╛рдж рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ Maybe Int рдпрд╛ Maybe String ред рдпрджрд┐ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рджреЛ рдкреИрд░рд╛рдореАрдЯрд░ рд▓реЗрддрд╛ рд╣реИ, Either, рд╣рдореЗрдВ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдк рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рддрдм рддрдХ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм рддрдХ рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рди рд▓реЗред рдЗрд╕рд▓рд┐рдП, рд╣рдо Functor Either where рдирд╣реАрдВ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдо Functor (Either a) where рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред рддрдм, рдЕрдЧрд░ рд╣рдордиреЗ рдХрд▓реНрдкрдирд╛ рдХреА рдереА рдХрд┐ fmap рдХреЗрд╡рд▓ Either a рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдерд╛, рддреЛ рдЗрд╕рдХреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рдХрд╛рд░ рд╣реЛрдВрдЧреЗ:

 fmap :: (b -> c) -> Either ab -> Either ac 


рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, Either a рд╣рд┐рд╕реНрд╕рд╛ рддрдп рд╣реЛ рдЧрдпрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ Either a рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред

рдореИрдВ / рд╣реЗ рдЕрднрд┐рдиреЗрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ



рдЕрдм рддрдХ, рдЖрдкрдиреЗ рдЕрдзреНрдпрдпрди рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рдХрд┐рддрдиреЗ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ (рд╕рдЯреАрдХ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдЯрд╛рдЗрдк рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░) Functor рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ: [] рдФрд░ Maybe , Either a , рд╕рд╛рде рд╣реА Tree рдкреНрд░рдХрд╛рд░ рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдЕрдзреНрдпрд╛рдп 7 рдореЗрдВ рдмрдирд╛рдпрд╛ рд╣реИред рдЖрдкрдиреЗ рджреЗрдЦрд╛ рдХрд┐ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдХреИрд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЕрдЪреНрдЫреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред рдЕрдм IO рдЙрджрд╛рд╣рд░рдг рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓рддреЗ рд╣реИрдВред

рдпрджрд┐ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдорд╛рди рд╣реИ, рддреЛ рдХрд╣реЗрдВ, IO String рдХрд╛ рдкреНрд░рдХрд╛рд░, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ I / O рдХреНрд░рд┐рдпрд╛ рд╣реИ рдЬреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдореЗрдВ рдмрд╛рд╣рд░ рдЬрд╛рдПрдЧреА рдФрд░ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдЧреА, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдпрд╣ рдлрд┐рд░ рд╕реЗ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧреАред рдЗрд╕ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдПрдХ рдирд╛рдо рд╕реЗ рдмрд╛рдБрдзрдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдо <- рдкреНрд░рдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдзреНрдпрд╛рдп 8 рдореЗрдВ, рд╣рдордиреЗ рдмрд╛рдд рдХреА рдХрд┐ I / O рдХреНрд░рд┐рдпрд╛рдПрдВ рдЫреЛрдЯреЗ рдкреИрд░реЛрдВ рд╡рд╛рд▓реЗ рдмрдХреНрд╕реЗ рдХреА рддрд░рд╣ рдХреИрд╕реЗ рджрд┐рдЦрддреЗ рд╣реИрдВ рдЬреЛ рдмрд╛рд╣рд░ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдмрд╛рд╣рд░реА рджреБрдирд┐рдпрд╛ рд╕реЗ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдХреБрдЫ рдЕрд░реНрде рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗ рдХреНрдпрд╛ рд▓рд╛рдП рдереЗ, рд▓реЗрдХрд┐рди рджреЗрдЦрдиреЗ рдХреЗ рдмрд╛рдж рд╣рдореЗрдВ IO рдореЗрдВ рдореВрд▓реНрдп рдХреЛ рд╡рд╛рдкрд╕ рд▓рдкреЗрдЯрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдкреИрд░ рд╡рд╛рд▓реЗ рдмрдХреНрд╕реЗ рдХреА рдЗрд╕ рд╕рд╛рджреГрд╢реНрдпрддрд╛ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рдЖрдк рд╕рдордЭ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ IO рдПрдХ рдлрд╝рдирдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХреИрд╕реЗ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред

рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдХреИрд╕реЗ IO Functor рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИред рдЬрдм рд╣рдо рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ I / O рдХреНрд░рд┐рдпрд╛ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП fmap рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдПрдХ I / O рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЛ рд╡рд╛рдкрд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ рд╡рд╣реА рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдорд╛рд░рд╛ рдлрд╝рдВрдХреНрд╢рди рдЗрд╕рдХреЗ рдкрд░рд┐рдгрд╛рдореА рдореВрд▓реНрдп рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред рдпрд╣рд╛рдБ рдХреЛрдб рд╣реИ:
 instance Functor IO where fmap f action = do result <- action return (f result) 

I / O рдХреНрд░рд┐рдпрд╛ рдХреЛ рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреЗ рд╕рд╛рде рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкрд░рд┐рдгрд╛рдо I / O рдХреНрд░рд┐рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рддреБрд░рдВрдд рджреЛ рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдПрдХ рд╕рд╛рде рдХрд░рдиреЗ рдФрд░ рдПрдХ рдирдпрд╛ рдмрдирд╛рдиреЗ рдХреЗ do рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ do ред fmap рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ fmap рд╣рдо рдПрдХ рдирдпрд╛ I / O рдПрдХреНрд╢рди рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ рдкрд╣рд▓реЗ I / O рдПрдХреНрд╢рди рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдирд╛рдо result ред рдлрд┐рд░ рд╣рдо return (f result) ред рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ return рдПрдХ рдРрд╕рд╛ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ I / O рдХреНрд░рд┐рдпрд╛ рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдЗрд╕рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рдХреБрдЫ рджреЗрддрд╛ рд╣реИред

рдЬреЛ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдмреНрд▓реЙрдХ рдХрд░рддрд╛ рд╣реИ рд╡рд╣ рд╣рдореЗрд╢рд╛ рдЕрдкрдиреА рдЕрдВрддрд┐рдо рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдкрд░рд┐рдгрд╛рдореА рдореВрд▓реНрдп рд▓реМрдЯрд╛рдПрдЧрд╛ред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╣рдо return рдХрд╛ рдЙрдкрдпреЛрдЧ I / O рдХрд╛рд░реНрд░рд╡рд╛рдИ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ return рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдирдП I / O рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк f result рджреЗрддрд╛ рд╣реИред рдЗрд╕ рдХреЛрдб рдХреЗ рдЯреБрдХрдбрд╝реЗ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ:

 main = do line <- getLine let line' = reverse line putStrLn $ "You said " ++ line' ++ " backwards!" putStrLn $ "Yes, you really said" ++ line' ++ " backwards! 


рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╣рдо рдЗрд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╡рд╛рдкрд╕ рджреЗрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрд▓рдЯрд╛ред рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ fmap рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ fmap рдлрд┐рд░ рд╕реЗ рдХреИрд╕реЗ fmap :

 main = do line <- fmap reverse getLine putStrLn $ "You said " ++ line ++ " backwards!" putStrLn $ "Yes, you really said" ++ line ++ " backwards!" 


рд╡рд┐рджреЗрд╢реА рдЬрд┐рд╕ рддрд░рд╣ рд╣рдо fmap reverse рд╕рд╛рде Just "blah" рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, Just "blah" fmap reverse Just "halb" рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдо getLine рдХреЛ fmap reverse рд╕рд╛рде рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред getLine рдПрдХ I / O рдХреНрд░рд┐рдпрд╛ рд╣реИ рдЬреЛ IO String рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреА рд╣реЛрддреА рд╣реИ рдФрд░ рдЗрд╕реЗ reverse рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рд╕реЗ рд╣рдореЗрдВ I / O рдХреНрд░рд┐рдпрд╛ рдорд┐рд▓рддреА рд╣реИ рдЬреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдореЗрдВ рдмрд╛рд╣рд░ рдирд┐рдХрд▓ рдЬрд╛рдПрдЧреА рдФрд░ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдЧреА, рдФрд░ рдлрд┐рд░ рдЗрд╕рдХреЗ рдкрд░рд┐рдгрд╛рдо рдореЗрдВ reverse рд▓рд╛рдЧреВ рдХрд░реЗрдЧреАред рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдХрд┐ рд╣рдо рдХреНрдпрд╛ Maybe рдмреЙрдХреНрд╕ рдХреЗ рдЕрдВрджрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдо рдлрд╝рдВрдХреНрд╢рди рдХреЛ IO рдмреЙрдХреНрд╕ рдХреЗ рдЕрдВрджрд░ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдХреБрдЫ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдореЗрдВ рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдлрд┐рд░, рдЬрдм рд╣рдо рдкрд░рд┐рдгрд╛рдо рдХреЛ <- рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдирд╛рдо рд╕реЗ рдмрд╛рдБрдзрддреЗ рд╣реИрдВ, рддреЛ рдирд╛рдо рдЙрд╕ рдкрд░рд┐рдгрд╛рдо рдХреЛ рджрд░реНрд╢рд╛рдПрдЧрд╛ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рдЪреБрдХрд╛ рд╣реИред

fmap (++"!") getLine I / O рдСрдкрд░реЗрд╢рди fmap (++"!") getLine рдмрд┐рд▓рдХреБрд▓ getLine рддрд░рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИ, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ "!" рд╣рдореЗрд╢рд╛ рдЗрд╕рдХреЗ рдкрд░рд┐рдгрд╛рдо рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ "!" рдЕрдВрдд рддрдХ!

рдпрджрд┐ fmap рдХреЗрд╡рд▓ IO рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЯрд╛рдЗрдк fmap :: (a -> b) -> IO a -> IO b ред fmap рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдФрд░ I / O рдСрдкрд░реЗрд╢рди рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдкреБрд░рд╛рдиреЗ рдХреЗ рд╕рдорд╛рди рдПрдХ рдирдпрд╛ I / O рдСрдкрд░реЗрд╢рди рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдХреЛрдИ рдлрд╝рдВрдХреНрд╢рди рдЗрд╕рдореЗрдВ рдирд┐рд╣рд┐рдд рдкрд░рд┐рдгрд╛рдо рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред

рдпрджрд┐ рдЖрдк рдХрднреА рднреА рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдРрд╕реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдкрд╛рддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдЖрдк рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде I / O рдСрдкрд░реЗрд╢рди рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП fmap , рдФрд░ рдлрд┐рд░ рдЕрдЧрд▓рд╛ рдкрд░рд┐рдгрд╛рдо рдХрд┐рд╕реА рдЕрдиреНрдп рдирд╛рдо рдХреЛ рджреЗрддреЗ рд╣реИрдВ, рддреЛ fmap рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рдлрд╝рдирдХрд╛рд░ рдХреЗ рдЕрдВрджрд░ рдХреБрдЫ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдХрдИ рдлрд╝рдВрдХреНрд╢рди рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЕрдкрдиреЗ рдХрд╛рд░реНрдп рдХреЛ рд╢реАрд░реНрд╖ рд╕реНрддрд░ рдкрд░ рдШреЛрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдПрдХ рд▓рдВрдмреЛ рдлрд╝рдВрдХреНрд╢рди рдпрд╛ рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ, рдлрд╝рдВрдХреНрд╢рди рдХреА рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 import Data.Char import Data.List main = do line <- fmap (intersperse '-' . reverse . map toUpper) getLine putStrLn line 


рдпрджрд┐ рд╣рдо рдЗрд╕ рдХреЛрдб рдХреЛ рдЪрд▓рд╛рддреЗ рд╣реИрдВ рдФрд░ рд╡рд╣рд╛рдВ рд╣реИрд▓реЛ рджрд░реНрдЬ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ:
 $ runhaskell fmapping_io hello there EREHT- -OLLEH 

рдлрдВрдХреНрд╢рди intersperse '-' . reverse . map toUpper intersperse '-' . reverse . map toUpper intersperse '-' . reverse . map toUpper рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд▓реЗрддрд╛ рд╣реИ, рдЗрд╕реЗ toUpper рд╕рд╛рде рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЗрд╕ рдкрд░рд┐рдгрд╛рдо рдкрд░ reverse рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЗрд╕ рдкрд░рд┐рдгрд╛рдо intersperse '-' рдХреЛ toUpper рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХрд╛ рдПрдХ рдЕрдзрд┐рдХ рд╕реБрдВрджрд░ рддрд░реАрдХрд╛ рд╣реИ:

(\xs -> intersperse '-' (reverse (map toUpper xs)))

рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп



рдПрдХ рдФрд░ Functor рдЙрджрд╛рд╣рд░рдг рдЬреЛ рд╣рдо рд╕рднреА рд╕рдордп рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ (->) r ред рдмрдВрдж рдХрд░реЛ! рдирд░рдХ рдХреНрдпрд╛ (->) r рдорддрд▓рдм рд╣реИ? рдлрд╝рдВрдХреНрд╢рди r -> a рдХрд╛ рдкреНрд░рдХрд╛рд░ r -> a рдХреЛ рдлреЙрд░реНрдо (->) ra рдореЗрдВ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕ рддрд░рд╣ рд╣рдо рдлреЙрд░реНрдо рдореЗрдВ 2 + 3 рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ (+) 2 3 ред рдЬрдм рд╣рдо рдЗрд╕реЗ (->) ra рд░реВрдк рдореЗрдВ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо (->) рдХреБрдЫ рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд╢ рдореЗрдВ рджреЗрдЦрддреЗ рд╣реИрдВред рдпрд╣ рдмрд╕ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╣реИ рдЬреЛ рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рд▓реЗрддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ Either рдХрд░рддрд╛ рд╣реИред

рд▓реЗрдХрд┐рди рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдХреЛ рдмрд┐рд▓реНрдХреБрд▓ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рдЙрд╕реЗ Functor рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╣рдо Functor рдХрд╛ (->) рдЙрджрд╛рд╣рд░рдг (->) рдирд╣реАрдВ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ; рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ (->) r рд╕реЗ рдкрд╣рд▓реЗ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕рд╕реЗ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред рдпрджрд┐ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдиреЗ рдЖрдкрдХреЛ рдЕрдиреБрднрд╛рдЧреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдЯрд╛рдЗрдк рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреА рд╣реИ (рд╣рдо рдХреИрд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ + (2+) , рдЬреЛ рдХрд┐ (+) 2 ) рдХреЗ рд╕рдорд╛рди рд╣реИ, рддреЛ рдЖрдк (->) r as (r->) рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред

рдлрд╝рдВрдХреНрд╢рди рдХреИрд╕реЗ рд╣реЛрддреЗ рд╣реИрдВ? рдареАрдХ рд╣реИ, рдЪрд▓рд┐рдП Control.Monad.Instances рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓рддреЗ рд╣реИрдВ рдЬреЛ Control.Monad.Instances ред

 instance Functor ((->) r) where fmap fg = (\x -> f (gx)) 


рдЖрдЗрдП рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ fmap рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрддреЗ рд╣реИрдВ:
 fmap :: (a -> b) -> fa -> fb 

рдЕрдЧрд▓рд╛, рдЖрдЗрдП рдорд╛рдирд╕рд┐рдХ рд░реВрдк рд╕реЗ рд╣рд░ f рдмрджрд▓реЗрдВ, рдЬреЛ рдХрд┐ рд╣рдорд╛рд░реЗ рдлрдирдХрд╛рд░ рдЙрджрд╛рд╣рд░рдг рдХреА рднреВрдорд┐рдХрд╛ рд╣реИ, (->) r ред рдпрд╣ рд╣рдореЗрдВ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ рдХрд┐ рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ fmap рдХреЛ fmap рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣рд╛рдБ рдкрд░рд┐рдгрд╛рдо рд╣реИ:
 fmap :: (a -> b) -> ((->) ra) -> ((->) rb) 

рдЕрдм рд╣рдо infix рд░реВрдк рдореЗрдВ рдкреНрд░рдХрд╛рд░ (->) ra рдФрд░ (->) rb рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рддред
r -> a рдФрд░ r -> b , рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рдЖрдорддреМрд░ рдкрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд░рддреЗ рд╣реИрдВ:
 fmap :: (a -> b) -> (r -> a) -> (r -> b) 

рд╕рдм рдареАрдХ рд╣реИред рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рджреВрд╕рд░реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдореИрдк рдХрд░рдирд╛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреИрд╕реЗ рдореИрдкрд┐рдВрдЧ Maybe рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде Maybe рдЙрддреНрдкрд╛рджрди рдХрд░реЗрдВ, рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдПрдХ рд╕реВрдЪреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рд╕реЗ рдПрдХ рд╕реВрдЪреА рдХрд╛ рдЙрддреНрдкрд╛рджрди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдкрд┐рдЫрд▓рд╛ рдкреНрд░рдХрд╛рд░ рд╣рдореЗрдВ рдХреНрдпрд╛ рдмрддрд╛рддрд╛ рд╣реИ? рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ r рд╕реЗ b рддрдХ рдПрдХ рдлрдВрдХреНрд╢рди рд▓реЗрддрд╛ рд╣реИ рдФрд░ r рд╕реЗ b рддрдХ рдПрдХ рдлрдВрдХреНрд╢рди рджреЗрддрд╛ рд╣реИред рдХреНрдпрд╛ рдпрд╣ рдЖрдкрдХреЛ рдХреБрдЫ рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реИ? рд╣рд╛рдБ, рдХрд╛рд░реНрдпреЛрдВ рдХреА рдПрдХ рд░рдЪрдирд╛! рд╣рдо рдЖрдЙрдЯрдкреБрдЯ r -> a рдХреЛ рдЗрдирдкреБрдЯ a -> b рдХреЛ рдлрдВрдХреНрд╢рди r -> b рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐ рдлрдВрдХреНрд╢рдиреНрд╕ рдХреА рд░рдЪрдирд╛ рд╣реИред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЛ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдПрдХ рдФрд░ рддрд░реАрдХрд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
 instance Functor ((->) r) where fmap = (.) 

рдпрд╣ рдХреЛрдб рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ рдХрд┐ fmap рдХреЛ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреА рдПрдХ рд░рдЪрдирд╛ рд╣реИред рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ, Control.Monad.Instances рдЖрдпрд╛рдд рдХрд░реЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд╣ рдореЙрдбреНрдпреВрд▓ рд╣реИ рдЬрд╣рд╛рдВ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓реЛрдб рдХрд░реЗрдВ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд╕рд╛рде рдЦреЗрд▓рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ:
 ghci> :t fmap (*3) (+100) fmap (*3) (+100) :: (Num a) => a -> a ghci> fmap (*3) (+100) 1 303 ghci> (*3) `fmap` (+100) $ 1 303 ghci> (*3) . (+100) $ 1 303 ghci> fmap (show . (*3)) (*100) 1 "300" 

рд╣рдо рдЗрд╕реЗ рдПрдХ рд╕рдорд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП fmap рдХреЛ рдПрдХ fmap рдлрд╝рдВрдХреНрд╢рди рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ . рд╕реНрдкрд╖реНрдЯ рдерд╛ред рдЗрдирдкреБрдЯ рдХреА рджреВрд╕рд░реА рдкрдВрдХреНрддрд┐ рдореЗрдВ, рд╣рдо (*3) рдХреА рдорджрдж рд╕реЗ (+100) рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рджреЗрддрд╛ рд╣реИ рдЬреЛ рдЗрдирдкреБрдЯ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдЧрд╛, рдЗрд╕реЗ (+100) рд▓рд╛рдЧреВ рдХрд░реЗрдЧрд╛, рдФрд░ рдлрд┐рд░ рдЗрд╕ рдкрд░рд┐рдгрд╛рдо (*3) ред рдлрд┐рд░ рд╣рдо рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ 1 рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред

рд╕рднреА рдкреНрд░рдХрд╛рд░рд╛рдВрддрд░реЛрдВ рдХреА рддрд░рд╣, рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рдВрджрд░реНрднреЛрдВ рдХреЗ рд╕рд╛рде рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЬрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдлрд╝рдВрдХреНрд╢рди (+3) , рддреЛ рд╣рдо рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рдореВрд▓реНрдп рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд╕рдВрджрд░реНрдн рдпрд╣ рд╣реИ рдХрд┐ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдкрд░ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред fmap (*3) рд╕реЗ (+100) рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╕реЗ рдПрдХ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдмрдиреЗрдЧрд╛ рдЬреЛ (+100) рдХреЗ рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдкрд░рд┐рдгрд╛рдо рд▓реМрдЯрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, (*3) рдЗрд╕ рдкрд░рд┐рдгрд╛рдо рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ fmap рдХрд╛рд░реНрдп рдХреА рдПрдХ рд╕рдВрд░рдЪрдирд╛ рд╣реИ, рдЗрд╕ рд╕рдордп рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо рдпрд╣ рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред рдпрд╣ рд╣рдорд╛рд░реЗ рджрд┐рдорд╛рдЧреЛрдВ рдХреЛ рдереЛрдбрд╝рд╛ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ рдФрд░ рд╣рдореЗрдВ рдпрд╣ рджреЗрдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдмреЙрдХреНрд╕ ( IO рдФрд░ (->) r ) рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЧрдгрдирд╛ рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╕рдВрд╕реНрдерд╛рдПрдВ рдХреИрд╕реЗ рдлрдВрдХреНрд╢рдирд▓ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЧрдгрдирд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рдЙрд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рдЧрдгрдирд╛ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рдЗрд╕ рдЧрдгрдирд╛ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИред

рд▓рд┐рдлреНрдЯрд░
рдЙрди рдХрд╛рдиреВрдиреЛрдВ рдкрд░ рдЖрдЧреЗ рдмрдврд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЬрд┐рдиреНрд╣реЗрдВ fmap рдХрд╛ рдкрд╛рд▓рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЖрдЗрдП рдлрд┐рд░ рд╕реЗ fmap рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ fmap :

 fmap :: (a -> b) -> fa -> fb 


рдЕрдзреНрдпрд╛рдп 5 рдореЗрдВ рдХрд░реА рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдЪрдп рдЗрд╕ рдХрдерди рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реБрдЖ рдХрд┐ рд╣рд╛рд╕реНрдХреЗрд▓ рдХреЗ рд╕рднреА рдХрд╛рд░реНрдп рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рд▓реЗрддреЗ рд╣реИрдВред рдлрд╝рдВрдХреНрд╢рди a -> b -> c рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЯрд╛рдЗрдк рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рд▓реЗрддрд╛ a , рдФрд░ рдлрд┐рд░ рдлрд╝рдВрдХреНрд╢рди b -> c рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдЬреЛ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рд▓реЗрддрд╛ рд╣реИ рдФрд░ c рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдЕрдкрд░реНрдпрд╛рдкреНрдд рдорд╛рдкрджрдВрдбреЛрдВ (рдЗрд╕рдХреЗ рдЖрдВрд╢рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ) рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рджреЗрддрд╛ рд╣реИ рдЬреЛ рдХрдИ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдордиреЗ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдерд╛ (рдпрджрд┐ рд╣рдо рдлрд┐рд░ рд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рдордЭрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рдХрд┐ рд╡реЗ рдХрдИ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ)ред рдЗрд╕рд▓рд┐рдП, рдХрд░реА рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП a -> b -> c рдХреЛ a -> (b -> c) рд░реВрдк рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЙрд╕реА рдирд╕ рдореЗрдВ, рдЕрдЧрд░ рд╣рдо fmap :: (a -> b) -> (fa -> fb) fmap , рддреЛ рд╣рдо fmap рдХреЛ рдПрдХ рдлрдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ рдлрдВрдХреНрд╢рди рдФрд░ рдПрдХ рдлрдВрдХреНрд╢рдирд▓ рд╡реИрд▓реНрдпреВ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдПрдХ рдлрдирдХрд╛рд░ рд╡реИрд▓реНрдпреВ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдлрдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдПрдХ рдирдпрд╛ рдлрд╝рдВрдХреНрд╢рди рджреЗрддрд╛ рд╣реИ рдЬреЛ рдкрд┐рдЫрд▓реЗ рдПрдХ рдХреЗ рд╕рдорд╛рди рд╣реИ, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдпрд╣ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рдирд▓ рдорд╛рди рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдПрдХ рдлрд╝рдВрдХреНрд╢рдирд▓ рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдпрд╣ рдлрдВрдХреНрд╢рди рдХреЛ a -> b рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдлрдВрдХреНрд╢рди рдХреЛ fa -> fb рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдЗрд╕реЗ "рдЙрдард╛рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп" рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред GHCi рдореЗрдВ :t рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЗ рд╕рд╛рде рдЦреЗрд▓рддреЗ рд╣реИрдВ:

 ghci> :t fmap (*2) fmap (*2) :: (Num a, Functor f) => fa -> fa ghci> :t fmap (replicate 3) fmap (replicate 3) :: (Functor f) => fa -> f [a] 


рдПрдХреНрд╕рдкреНрд░реЗрд╢рди fmap (*2) рдПрдХ рдРрд╕рд╛ рдлрдВрдХреНрд╢рди рд╣реИ рдЬреЛ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдкрд░ рдПрдХ рдлрдВрдХреНрд╢рдирд▓ f рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдирдВрдмрд░реЛрдВ рдкрд░ рдПрдХ fmap (*2) рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдпрд╣ рдлрд╝рдирдХрд╛рд░ рдПрдХ рд╕реВрдЪреА рд╣реЛ рд╕рдХрддреА рд╣реИ, Maybe , Either String , рдпрд╛ рдХреБрдЫ рдФрд░ред рдПрдХреНрд╕рдкреНрд░реЗрд╢рди fmap (replicate 3) рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдкрд░ рдПрдХ fmap (replicate 3) рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдЧрд╛ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рддрддреНрд╡реЛрдВ рдХреА рд╕реВрдЪреА рдореЗрдВ рдПрдХ fmap (replicate 3) рдХрд░реЗрдЧрд╛ред рдпрд╣ рдФрд░ рднреА рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдЕрдЧрд░ рд╣рдо рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рдХрд╣рддреЗ рд╣реИрдВ, fmap (++"!") , рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ GHCi рдореЗрдВ рдПрдХ рдирд╛рдо рд╕реЗ рдмрд╛рдБрдзреЗрдВред

рдЖрдк рджреЛ рддрд░реАрдХреЛрдВ рд╕реЗ fmap рдЕрдиреБрднрд╡ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:



рджреЛрдиреЛрдВ рд╣реА рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕рд╣реА рд╣реИрдВред

рдкреНрд░рдХрд╛рд░ fmap (replicate 3) :: (Functor f) => fa -> f [a] рдЕрд░реНрде рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХрд┐рд╕реА рднреА рдлрд╝рдирдХрд╛рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡рд╣ рдХреНрдпрд╛ рдХрд░реЗрдЧреА, рдпрд╣ рдлрд╝рдирдХрд╛рд░ рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИред рдпрджрд┐ рд╣рдо рд╕реВрдЪреА рдореЗрдВ fmap (replicate 3) рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕реВрдЪреА рдХреЗ рд▓рд┐рдП fmap рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЕрд░реНрдерд╛рдд рдмрд╕ map ред рдЕрдЧрд░ рд╣рдо рдЗрд╕реЗ Maybe a рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ Just replicate 3 рдЕрдВрджрд░ рдореВрд▓реНрдп рдкрд░ replicate 3 рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдЧрд╛ред рдпрджрд┐ рдпрд╣ рдорд╛рди Nothing , рддреЛ рдпрд╣ Nothing рдмрд░рд╛рдмрд░ рд░рд╣реЗрдЧрд╛ред рдпрд╣рд╛рдБ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ:

 ghci> fmap (replicate 3) [1,2,3,4] [[1,1,1],[2,2,2],[3,3,3],[4,4,4]] ghci> fmap (replicate 3) (Just 4) Just [4,4,4] ghci> fmap (replicate 3) (Right "blah") Right ["blah","blah","blah"] ghci> fmap (replicate 3) Nothing Nothing ghci> fmap (replicate 3) (Left "foo") Left "foo" 


рдлрдирдХрд╛рд░ рдХрд╛рдиреВрди



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

рдЕрдзрд┐рдирд┐рдпрдо 1



рдлрдВрдХреНрд╢рдВрд╕ рдХреЗ рдкрд╣рд▓реЗ рдХрд╛рдиреВрди рдореЗрдВ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рд╣рдо рдлрдВрдХреНрд╢рди рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХрд┐рд╕реА рдлрд╝рдирдХрд╛рд░ рдХреЗ рдорд╛рди рдкрд░ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдлрд╝рдВрдХреНрд╢рдирд▓ рдХрд╛ рдорд╛рди рдЬреЛ рд╣рдореЗрдВ рдорд┐рд▓рддрд╛ рд╣реИ, рд╡рд╣ рдлрд╝рдирдХрд╛рд░ рдХреЗ рдореВрд▓ рдореВрд▓реНрдп рдХреЗ рд╕рдорд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдереЛрдбрд╝рд╛ рдФрд░ рдФрдкрдЪрд╛рд░рд┐рдХ рд░реВрдк рдореЗрдВ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ fmap id = id ред рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ, рдпрд╣ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рд╣рдо рдХрд┐рд╕реА fmap id рдХреЗ рдореВрд▓реНрдп рдХреЗ рд▓рд┐рдП fmap id , рддреЛ рдпрд╣ рд╡реИрд╕рд╛ рд╣реА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреИрд╕рд╛ рдХрд┐ рдореВрд▓реНрдп рдкрд░ id рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реИред рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ id рдПрдХ рдкрд╣рдЪрд╛рди рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдмрд╕ рдЕрдкрдиреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдЗрд╕реЗ \x -> x рд░реВрдк рдореЗрдВ рднреА рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рд╣рдо fmap id = id рдХреЗ рдореВрд▓реНрдп рдХреЛ рдХрд┐рд╕реА рдРрд╕реА рдЪреАрдЬрд╝ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдХрд╛рдиреВрди fmap id = id рдмрд╣реБрдд рддреБрдЪреНрдЫ рдФрд░ рд╕реНрдкрд╖реНрдЯ рджрд┐рдЦрддрд╛ рд╣реИред

рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдХрд╛рдиреВрди рдлрдВрдХреНрд╢рдВрд╕ рдХреЗ рдХреБрдЫ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИред

 ghci> fmap id (Just 3) Just 3 ghci> id (Just 3) Just 3 ghci> fmap id [1..5] [1,2,3,4,5] ghci> id [1..5] [1,2,3,4,5] ghci> fmap id [] [] ghci> fmap id Nothing Nothing 


рдпрджрд┐ рд╣рдо рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, fmap рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ fmap , рддреЛ Maybe , рд╣рдо рд╕рдордЭ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ fmap рдХрд╛ рдкрд╣рд▓рд╛ рдирд┐рдпрдо рдХреНрдпреЛрдВ рд╣реИ:

 instance Functor Maybe where fmap f (Just x) = Just (fx) fmap f Nothing = Nothing 


рд╣рдо рдХрд▓реНрдкрдирд╛ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ id рдЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ f рдХреА рднреВрдорд┐рдХрд╛ рдирд┐рднрд╛рддрд╛ рд╣реИред рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрджрд┐ рд╣рдо Just x рдкрд░ fmap id , рддреЛ рдкрд░рд┐рдгрд╛рдо Just (id x) , рдФрд░ рдЪреВрдВрдХрд┐ id рдЕрднреА рдЕрдкрдирд╛ рдкреИрд░рд╛рдореАрдЯрд░ рджреЗрддрд╛ рд╣реИ, рд╣рдо рдпрд╣ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ Just (id x) Just x рдмрд░рд╛рдмрд░ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЕрдм рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЕрдЧрд░ рд╣рдо Just рд╡реИрд▓реНрдпреВ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдП рдЧрдП Maybe рд╡реИрд▓реНрдпреВ рдкрд░ id рд▓рдЧрд╛рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рд╡рд╣реА рд╡реИрд▓реНрдпреВ рд╡рд╛рдкрд╕ рдорд┐рд▓рддреА рд╣реИред

рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ Nothing рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП id рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╕рдорд╛рди рдореВрд▓реНрдп рд╣реИред рдЗрд╕рд▓рд┐рдП, fmap рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдЗрди рджреЛ рд╕рдорд╛рдирддрд╛рдУрдВ рд╕реЗ fmap рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдХрд╛рдиреВрди fmap id = id рдХрд╛ рд╕рдореНрдорд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЕрдзрд┐рдирд┐рдпрдо 2



рдиреНрдпрд╛рдп рджреВрд╕рд░рд╛ рдХрд╛рдиреВрди рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рджреЛ рдлрд╝рдВрдХреНрд╢рди рдХреА рд╕рдВрд░рдЪрдирд╛ рдФрд░ рдлрд╝рдВрдХреНрд╢рдирд▓ рдХреЗ рдкрд░рд┐рдгрд╛рдореА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмрд╛рдж рдХреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЛ рдлрд╝рдВрдХреНрдЯрд░ рдкрд░ рдкрд╣рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдФрд░ рдлрд┐рд░ рджреВрд╕рд░реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд╕рдорд╛рди рдкрд░рд┐рдгрд╛рдо рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред рдФрдкрдЪрд╛рд░рд┐рдХ рд╕рдВрдХреЗрддрди рдореЗрдВ, рдЗрд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ fmap (f . g) = fmap f . fmap g fmap (f . g) = fmap f . fmap g ред рдпрд╛, рдпрджрд┐ рд╣рдо рдЗрд╕реЗ рдЕрд▓рдЧ рддрд░рд╣ рд╕реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ fmap (f . g) x = fmap f (fmap gx) x рдХрд┐рд╕реА рднреА рдорд╛рди рдХреЗ x рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛ рдзрд╛рд░рдг рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП: fmap (f . g) x = fmap f (fmap gx) ред

рдпрджрд┐ рд╣рдо рдпрд╣ рдкрд╣рдЪрд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдкреНрд░рдХрд╛рд░ рдлрдВрдХреНрд╢рдВрд╕ рдХреЗ рджреЛ рдирд┐рдпрдореЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдЖрд╢рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдореИрдкрд┐рдВрдЧ рдХреА рдмрд╛рдд рдЖрдиреЗ рдкрд░ рдЕрдиреНрдп рдлрдВрдХреНрд╢рдирд▓рд░реНрд╕ рдХреЗ рд╕рдорд╛рди рд╣реА рдореМрд▓рд┐рдХ рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реЛред рд╣рдо рдпрд╣ рдЬрд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЬрдм рд╣рдо рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдбрд┐рд╕реНрдкреНрд▓реЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдкрд░реНрджреЗ рдХреЗ рдкреАрдЫреЗ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдПрдХ рдЗрдХрд╛рдИ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░реЗрдЧрд╛ рдЬрд┐рд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - рд╡рд╣ рд╣реИ, рдПрдХ рдлрд╝рдирдХрд╛рд░ред

рд╣рдо рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рджреВрд╕рд░рд╛ рдХрд╛рдиреВрди рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдХреИрд╕реЗ fmap рд╣реИ, рдЬреЛ рдЙрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП fmap рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ fmap , рдФрд░ рдлрд┐рд░ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рдо рдпрд╣ fmap рдХрд┐ Maybe рдкрд╣рд▓реЗ рдХрд╛рдиреВрди рдХрд╛ рдкрд╛рд▓рди рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдпрд╣ рдЬрд╛рдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП Maybe fmap (f . g) рдХрд╛ рджреВрд╕рд░рд╛ рдирд┐рдпрдо Maybe рдХрд┐ рдХреИрд╕реЗ Maybe , рдЕрдЧрд░ рд╣рдо Nothing рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП fmap (f . g) рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ Nothing рдорд┐рд▓рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХрд┐рд╕реА рднреА рдлрд╝рдВрдХреНрд╢рди рдХреЛ Nothing рднреА рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╕реЗ Nothing рдорд┐рд▓рддрд╛ рд╣реИред рдпрджрд┐ рд╣рдо fmap f (fmap g Nothing) рдирд┐рд╖реНрдкрд╛рджрд┐рдд fmap f (fmap g Nothing) , рддреЛ рд╣рдореЗрдВ рдЙрдиреНрд╣реАрдВ рдХрд╛рд░рдгреЛрдВ рд╕реЗ Nothing рдорд┐рд▓рддрд╛ рд╣реИред

рдпрд╣ рджреЗрдЦрдирд╛ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ рдХрд┐ рдореВрд▓реНрдп рдХреЗ рд▓рд┐рдП рджреВрд╕рд░рд╛ рдХрд╛рдиреВрди рдХреИрд╕реЗ Maybe рдЬрдм рдореВрд▓реНрдп Nothing редрд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рд╡рд╣ рдореВрд▓реНрдп Just? рдареАрдХ рд╣реИ, рдЕрдЧрд░ рд╣рдо рдХрд░рддреЗ рд╣реИрдВ fmap (f . g) (Just x), рд╣рдо рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ Just ((f . g) x), рдЬреЛ рд╕рдорд╛рди рд╣реИ Just (f (gx))ред рдпрджрд┐ рд╣рдо рдХрд░рддреЗ рд╣реИрдВ fmap f (fmap g (Just x)), рддреЛ рд╣рдо рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ fmap g (Just x)рдпрд╣ рдХреНрдпрд╛ рд╣реИ Just (gx)ред рдЗрд╕рд▓рд┐рдП, рдпрд╣ fmap f (fmap g (Just x))рдмрд░рд╛рдмрд░ рд╣реИ fmap f (Just (gx)), рд▓реЗрдХрд┐рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдмрд░рд╛рдмрд░ рд╣реИ Just (f (gx))ред

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

рдХрд╛рдиреВрди рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди



рдЖрдЗрдП рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рдПрдХ рдкреИрдереЛрд▓реЙрдЬрд┐рдХрд▓ рдЙрджрд╛рд╣рд░рдг рдХреЛ рджреЗрдЦреЗрдВ, рдЬреЛ рдХрд┐ рдлрд╝рдиреНрдХреНрдЯрд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ, рд▓реЗрдХрд┐рди рдлрд╝рдирдХрд╛рд░ рдХрд╛ рдирд╣реАрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХрд╛рдиреВрдиреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдХрд╣реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдирд┐рдореНрди рдкреНрд░рдХрд╛рд░ рд╣реИрдВ:
 data CMaybe a = CNothing | CJust Int a deriving (Show) 

Cрдпрд╣рд╛рдБ рдХрд╛рдЙрдВрдЯрд░ рдХреЗ рд▓рд┐рдП рдЦрдбрд╝рд╛ рд╣реИред рдпрд╣ рдПрдХ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИ рдЬреЛ рд╢рд╛рдпрдж рдмрд╣реБрдд рдХреБрдЫ рджрд┐рдЦрддрд╛ рд╣реИ, рдХреЗрд╡рд▓ рдПрдХ рд╣рд┐рд╕реНрд╕реЗ JustрдореЗрдВ рдПрдХ рдХреЗ рдмрдЬрд╛рдп рджреЛ рдлрд╝реАрд▓реНрдб рд╣реЛрддреЗ рд╣реИрдВред рдореВрд▓реНрдп рдирд┐рд░реНрдорд╛рддрд╛ рдореЗрдВ рдкрд╣рд▓рд╛ рдХреНрд╖реЗрддреНрд░ CJustрд╣рдореЗрд╢рд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реЛрдЧрд╛ Int, рдФрд░ рдпрд╣ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдХрд╛рдЙрдВрдЯрд░ рд╣реЛрдЧрд╛ред рдФрд░ рджреВрд╕рд░реЗ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ aрд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЯрд╛рдЗрдк рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХрд╛ рдкреНрд░рдХрд╛рд░ рдЙрд╕ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░реЗрдЧрд╛ рдЬрд┐рд╕реЗ рд╣рдо рдЪреБрдирддреЗ рд╣реИрдВ CMaybe aред рдЪрд▓реЛ рд╣рдорд╛рд░реЗ рдирдП рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдЦреЗрд▓рддреЗ рд╣реИрдВ:

 ghci> CNothing CNothing ghci> CJust 0 "haha" CJust 0 "haha" ghci> :t CNothing CNothing :: CMaybe a ghci> :t CJust 0 "haha" CJust 0 "haha" :: CMaybe [Char] ghci> CJust 100 [1,2,3] CJust 100 [1,2,3] 


рдпрджрд┐ рд╣рдо рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ CNothing, рддреЛ рдЗрд╕рдореЗрдВ рдХреЛрдИ рдлрд╝реАрд▓реНрдб рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рд╣рдо рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ CJust, рддреЛ рдкрд╣рд▓рд╛ рдлрд╝реАрд▓реНрдб рдПрдХ рдкреВрд░реНрдгрд╛рдВрдХ рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЪрд▓реЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддреЗ рд╣реИрдВ Functor, рддрд╛рдХрд┐ рд╣рд░ рдмрд╛рд░ рдЬрдм рд╣рдо рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ fmap, рддреЛ рдлрд╝рдВрдХреНрд╢рди рджреВрд╕рд░реЗ рдлрд╝реАрд▓реНрдб рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдкрд╣рд▓реЗ рдлрд╝реАрд▓реНрдб рджреНрд╡рд╛рд░рд╛ рдмрдврд╝рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ 1ред

 instance Functor CMaybe where fmap f CNothing = CNothing fmap f (CJust counter x) = CJust (counter+1) (fx) 


рдпрд╣ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд╕рдорд╛рди рд╣реИ Maybe, рдХреЗрд╡рд▓ рдЬрдм рд╣рдо fmapрдПрдХ рдореВрд▓реНрдп рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ рдЦрд╛рд▓реА рдмреЙрдХреНрд╕ (рдореВрд▓реНрдп CJust) рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ , рд╣рдо рдХреЗрд╡рд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕рд╛рдордЧреНрд░реА рдкрд░ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд╣рдо рдХрд╛рдЙрдВрдЯрд░ рджреНрд╡рд╛рд░рд╛ рднреА рдмрдврд╝рд╛рддреЗ рд╣реИрдВ 1ред рдЕрдм рддрдХ, рд╕рдм рдХреБрдЫ рдЕрдЪреНрдЫрд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИред рд╣рдо рдЗрд╕рдХреЗ рд╕рд╛рде рдереЛрдбрд╝рд╛ рдЦреЗрд▓ рднреА рд╕рдХрддреЗ рд╣реИрдВ:

 ghci> fmap (++"ha") (CJust 0 "ho") CJust 1 "hoha" ghci> fmap (++"he") (fmap (++"ha") (CJust 0 "ho")) CJust 2 "hohahe" ghci> fmap (++"blah") CNothing CNothing 


рдХреНрдпрд╛ рдпрд╣ рдкреНрд░рдХрд╛рд░ рдлрдВрдХреНрд╢рдВрд╕ рдХреЗ рдирд┐рдпрдореЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддрд╛ рд╣реИ? рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреБрдЫ рдХрд╛рдиреВрди рдХрд╛ рдкрд╛рд▓рди рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рдкреНрд░рддрд┐рдзрд╛рд░рдг рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред

 ghci> fmap id (CJust 0 "haha") CJust 1 "haha" ghci> id (CJust 0 "haha") CJust 0 "haha" 


рдЬреИрд╕рд╛ рдХрд┐ рдлрдВрдХреНрд╢рдирд▓рд░реНрд╕ рдХрд╛ рдкрд╣рд▓рд╛ рдирд┐рдпрдо рдХрд╣рддрд╛ рд╣реИ, рдпрджрд┐ рд╣рдо рдлрдВрдЯрд░ рдХреЗ рдорд╛рди рдХреЛ рдЖрдИрдбреА рдХреЗ рд╕рд╛рде рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╡реИрд╕рд╛ рд╣реА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреИрд╕рд╛ idрдлрдирдХрд╛рд░ рдХреЗ рд╕рдорд╛рди рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рд╣реЛрддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╣рдорд╛рд░реЗ рдлрд╝рдирдХрд╛рд░ рдкрд░ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ CMaybeред рдпрджреНрдпрдкрд┐ рдпрд╣ рдкреНрд░рдХрд╛рд░ рд╡рд░реНрдЧ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ Functor, рдпрд╣ рдлрдВрдХреНрд╢рдВрд╕ рдХреЗ рджрд┐рдП рдЧрдП рдХрд╛рдиреВрди рдХрд╛ рдкрд╛рд▓рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП, рдпрд╣ рдПрдХ рдлрд╝рдирдХрд╛рд░ рдирд╣реАрдВ рд╣реИред

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

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

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

рдПрдкреНрд▓рд╛рдЗрдб рдлрдВрдХреНрд╢рдирд▓рд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛


present
рдЗрд╕ рд╕реЗрдХреНрд╢рди рдореЗрдВ, рд╣рдо рдЙрди рдПрдкреНрд▓рд╛рдЗрдб рдлрдВрдХреНрд╢рдирд▓рд░реНрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдПрдХреНрд╕рдЯреЗрдВрдбреЗрдб рдлрдВрдХреНрд╢рдирд▓рд░реНрд╕ рд╣реИрдВред

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

рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣реИ Just 3рдФрд░ рд╣рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ fmap (*) (Just 3), рддреЛ рд╣рдореЗрдВ рдХреНрдпрд╛ рдорд┐рд▓реЗрдЧрд╛? рдЙрджрд╛рд╣рд░рдг рдХреЗ Maybeрд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ , Functorрд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдпрджрд┐ рдпрд╣ рдорд╛рди рд╣реИ Just, рддреЛ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдорд╛рди рдХреЗ рдЕрдВрджрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ Justред рдЗрд╕рд▓рд┐рдП, рдирд┐рд╖реНрдкрд╛рджрди fmap (*) (Just 3)рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛ Just ((*) 3), рдЬрд┐рд╕реЗ Just (3 *)рдпрджрд┐ рд╣рдо рдЕрдиреБрднрд╛рдЧреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдлреЙрд░реНрдо рдореЗрдВ рднреА рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред рджрд┐рд▓рдЪрд╕реНрдк!рд╣рдо рдПрдХ рд╕рдорд╛рд░реЛрд╣ рдореЗрдВ рд▓рд┐рдкрдЯреЗ рд╣реЛ Just!

рдпрд╣рд╛рдБ рдлрд╝рдВрдХреНрд╢рдирд▓ рдорд╛рди рдХреЗ рдЕрдВрджрд░ рдХреБрдЫ рдФрд░ рдХрд╛рд░реНрдп рджрд┐рдП рдЧрдП рд╣реИрдВ:

 ghci> :t fmap (++) (Just "hey") fmap (++) (Just "hey") :: Maybe ([Char] -> [Char]) ghci> :t fmap compare (Just 'a') fmap compare (Just 'a') :: Maybe (Char -> Ordering) ghci> :t fmap compare "A LIST OF CHARS" fmap compare "A LIST OF CHARS" :: [Char -> Ordering] ghci> :t fmap (\xyz -> x + y / z) [3,4,5,6] fmap (\xyz -> x + y / z) [3,4,5,6] :: (Fractional a) => [a -> a -> a] 


рдпрджрд┐ рд╣рдо рдЙрди рд╡рд░реНрдгреЛрдВ рдХреА рд╕реВрдЪреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдирдХреА рд╕рд╣рд╛рдпрддрд╛ рд╕реЗ compareрдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ (Ord a) => a -> a -> Ordering, рддреЛ рд╣рдореЗрдВ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдорд┐рд▓рддреА рд╣реИ Char -> Ordering, рдХреНрдпреЛрдВрдХрд┐ compareрд╕реВрдЪреА рдореЗрдВ рд╡рд░реНрдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╕реВрдЪреА рдирд╣реАрдВ рд╣реИ (Ord a) => a -> Ordering, рдХреНрдпреЛрдВрдХрд┐ рдкрд╣рд▓реЗ рдЖрд╡реЗрджрди aрдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдерд╛ Char, рдФрд░ рдЗрд╕рд▓рд┐рдП рджреВрд╕рд░реЗ aрдХреЛ рдпрд╣ рддрдп рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ Charред

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

 ghci> let a = fmap (*) [1,2,3,4] ghci> :ta a :: [Integer -> Integer] ghci> fmap (\f -> f 9) a [9,18,27,36] 


рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдлрдВрдХреНрд╢рдирд▓ рд╡реИрд▓реНрдпреВ Just (3 *)рдФрд░ рдПрдХ рдлрдВрдХреНрд╢рдирд▓ рд╡реИрд▓реНрдпреВ рд╣реИ Just 5, рдФрд░ рд╣рдо Just (3 *)рдЗрд╕рдХреЗ рд╕рд╛рде рдПрдХ рдлрдВрдХреНрд╢рди рдирд┐рдХрд╛рд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдЗрд╕рдХреЗ рд╕рд╛рде рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ Just 5рдЪрд╛рд╣рддреЗ рд╣реИрдВ? рд╕рд╛рдзрд╛рд░рдг рдлрд╝рдВрдХреНрд╢рдирд▓рд░реНрд╕ рдХреЗ рд╕рд╛рде, рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдХреЗрд╡рд▓ рд╕рд╛рдзрд╛рд░рдг рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореМрдЬреВрджрд╛ рдлрд╝рдВрдХреНрд╢рдирд▓рд░реНрд╕ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЬрдм рд╣рдордиреЗ рдПрдХ рдлрд╝рдВрдХреНрдЯрд░ рдХреЗ рд╕рд╛рде рдлрд╝рдВрдХреНрд╢рдВрд╕ \f -> f 9рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдП, рддреЛ рд╣рдордиреЗ рдЗрд╕реЗ рдПрдХ рдирд┐рдпрдорд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ред рд▓реЗрдХрд┐рди рдЬреЛ рд╣рдореЗрдВ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ fmap, рдЙрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ , рд╣рдо рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреА рдорджрдж рд╕реЗ, рдЬреЛ рдХрд┐ рдлрд╝рдиреНрдХреНрдЯрд░ рдХреЗ рдореВрд▓реНрдп рдХреЗ рдЕрдВрджрд░ рд╣реИ, рдлрд╝рдирдХрд╛рд░ рдХреЗ рджреВрд╕рд░реЗ рдорд╛рди рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╣рдо рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ JustрдХреЛ рдирдореВрдиреЗ рд╕реЗ рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдорд┐рд▓рд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ , рдФрд░ рдлрд┐рд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ Just 5, рд▓реЗрдХрд┐рди рд╣рдо рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рдФрд░ рд╕рд╛рд░ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рддрд▓рд╛рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдХрд┐ рдлрдВрдХреНрд╢рдВрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдЖрд╡реЗрджрдХ рдлрдВрдХреНрд╢рдВрд╕ рдХреЛ рд╢реБрднрдХрд╛рдордирд╛рдПрдВ рджреЗрдВ



рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рд╕реНрдерд┐рдд рдЖрд╡реЗрджрди рдкреНрд░рдХрд╛рд░ рд╡рд░реНрдЧ рд╕реЗ рдорд┐рд▓реЛ Control.Applicativeред рдпрд╣ рджреЛ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ: pureрдФрд░ <*>ред рдпрд╣ рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рджреЛрдиреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╣рдо рдХреБрдЫ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рдЖрд╡реЗрджрдХ рдЕрдВрддрд┐рдо рд╕рдВрд╕реНрдХрд╛рд░ рд╣реЛред рдЗрд╕ рд╡рд░реНрдЧ рдХреЛ рдЗрд╕ рддрд░рд╣ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

 class (Functor f) => Applicative f where pure :: a -> fa (<*>) :: f (a -> b) -> fa -> fb 


рдпрд╣ рд╕рд░рд▓ рддреАрди-рд▓рд╛рдЗрди рд╡рд░реНрдЧ рдкрд░рд┐рднрд╛рд╖рд╛ рд╣рдореЗрдВ рдмрд╣реБрдд рдХреБрдЫ рдмрддрд╛рддреА рд╣реИ! рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдПрдХ рд╡рд░реНрдЧ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрддреА рд╣реИ Applicative, рдФрд░ рдпрд╣ рдПрдХ рд╡рд░реНрдЧ рдмрд╛рдзрд╛ рднреА рдкреЗрд╢ рдХрд░рддреА рд╣реИред рдкреНрд░рддрд┐рдмрдВрдз рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рд╣рдо рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдХреЛ рдПрдХ рд╡рд░реНрдЧ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ Applicative, рддреЛ рдпрд╣ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдкреНрд░рдХрд╛рд░ рд╡рд░реНрдЧ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП Functorред рдЗрд╕реАрд▓рд┐рдП рдЬрдм рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд░реНрдЧ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ Applicative, рддреЛ рд╡рд╣ рднреА рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд░реНрдЧ рдХрд╛ рд╣реИ Functor, рддрд╛рдХрд┐ рд╣рдо рдЙрд╕ рдкрд░ рдЖрд╡реЗрджрди рдХрд░ рд╕рдХреЗрдВ fmapред

рдкрд╣рд▓реА рд╡рд┐рдзрд┐ рдЬрд┐рд╕реЗ рд╡рд╣ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЙрд╕реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ pureред рдЙрд╕рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╡рд┐рдЬреНрдЮрд╛рдкрди рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ pure :: a -> faредfрдРрдкреНрд▓рд┐рдХреЗрдЯрд░ рдлрд╝рдВрдХреНрдЯрд░ рдХреЗ рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдХреА рднреВрдорд┐рдХрд╛ рдирд┐рднрд╛рддрд╛ рд╣реИред рдЪреВрдВрдХрд┐ рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рдПрдХ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рдкреНрд░рдХрд╛рд░ рдХреА рдкреНрд░рдгрд╛рд▓реА рд╣реИ, рдФрд░ рдЪреВрдВрдХрд┐ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдХреБрдЫ рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХреБрдЫ рдореВрд▓реНрдп рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдо рдкреНрд░рдХрд╛рд░ рдХреА рдШреЛрд╖рдгрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рдХреБрдЫ рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рдкреНрд░рдХрд╛рд░ рдХреЛрдИ рдЕрдкрд╡рд╛рдж рдирд╣реАрдВ рд╣реИред

pureрдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдорд╛рди рд▓реЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЙрд╕ рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рдПрдХ рдЖрд╡реЗрджрдХ рдореВрд▓реНрдп рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╡рд╛рдХреНрдпрд╛рдВрд╢ "рдЗрд╕рдХреЗ рдЕрдВрджрд░", рдлрд┐рд░ рд╕реЗ рдмреЙрдХреНрд╕ рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░реЗ рд╕рд╛рджреГрд╢реНрдп рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╣рдордиреЗ рджреЗрдЦрд╛ рдХрд┐ рдпрд╣ рд╣рдореЗрд╢рд╛ рдкрд░реАрдХреНрд╖рдг рдкрд╛рд╕ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдкреНрд░рдХрд╛рд░ a -> faрдЕрднреА рднреА рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рд╣реИред рд╣рдо рдореВрд▓реНрдп рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдПрдХ рд▓рд╛рдЧреВ рдореВрд▓реНрдп рдореЗрдВ рд▓рдкреЗрдЯрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдпрд╣ рдорд╛рди рд╣реЛрддрд╛ рд╣реИред рдХрд▓реНрдкрдирд╛ рдХрд░рдиреЗ рдХрд╛ рдмреЗрд╣рддрд░ рддрд░реАрдХрд╛pure- рдпрд╣ рдХрд╣рдирд╛ рдХрд┐ рдпрд╣ рдПрдХ рдореВрд▓реНрдп рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕рдВрджрд░реНрдн (рдпрд╛ рд╢реБрджреНрдз рд╕рдВрджрд░реНрдн) рдореЗрдВ рд░рдЦрддрд╛ рд╣реИ - рдиреНрдпреВрдирддрдо рд╕рдВрджрд░реНрдн рдЬреЛ рдЕрднреА рднреА рдЗрд╕ рдореВрд▓реНрдп рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддрд╛ рд╣реИред

рд╕рдорд╛рд░реЛрд╣ <*>рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред рдЙрд╕рдХреА рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рд╣реИ:

 f (a -> b) -> fa -> fb 


рдХреНрдпрд╛ рдпрд╣ рдЖрдкрдХреЛ рдХреБрдЫ рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реИ? рдРрд╕рд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИ fmap :: (a -> b) -> fa -> fbред рдЖрдк рдлрд╝рдВрдХреНрд╢рди <*>рдХреЛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ fmapред рдЬрдмрдХрд┐ рдпрд╣ fmapрдПрдХ рдлрд╝рдВрдХреНрд╢рди рдФрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рдирд▓ рд╡реИрд▓реНрдпреВ рд▓реЗрддрд╛ рд╣реИ, рдФрд░ рдлрд╝рдВрдХреНрд╢рдирд▓ рд╡реИрд▓реНрдпреВ рдХреЗ рдЕрдВрджрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдПрдХ рдлрд╝рдВрдХреНрд╢рдирд▓ рд╡реИрд▓реНрдпреВ <*>рд▓реЗрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ рдлрд╝рдВрдХреНрд╢рдВрд╕ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд╣рд▓реЗ рдлрд╝рдирдХрд╛рд░ рд╕реЗ рдирд┐рдХрд╛рд▓рддрд╛ рд╣реИ, рдлрд┐рд░ рдЗрд╕рдХреЗ рд╕рд╛рде рджреВрд╕рд░рд╛ рдлрд╝рдирдХрд╛рд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред

рдРрдкреНрд▓рд┐рдХреЗрдЯрд░ рдлрд╝рдВрдХреНрдЯрд░ рд╢рд╛рдпрдж



рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓рддреЗ рд╣реИрдВ ApplicativeрдХреЗ рд▓рд┐рдП Maybe:

 instance Applicative Maybe where pure = Just Nothing <*> _ = Nothing (Just f) <*> something = fmap f something 


рдлрд┐рд░ рд╕реЗ, рд╣рдо рдЙрд╕ рд╡рд░реНрдЧ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рд╕реЗ рджреЗрдЦрддреЗ рд╣реИрдВ f, рдЬреЛ рдПрдХ рдРрдкреНрд▓рд┐рдХреЗрдЯрд░ рдлрд╝рдВрдХреНрдЯрд░ рдХреА рднреВрдорд┐рдХрд╛ рдирд┐рднрд╛рддрд╛ рд╣реИ, рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рд▓реЗрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рд▓рд┐рдП рд╣рдо Applicative Maybe whereрдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЙрджрд╛рд╣рд░рдг рд▓рд┐рдЦрддреЗ рд╣реИрдВ instance Applicative (Maybe a) whereред

рдЕрдЧрд▓рд╛, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣реИ pureред рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЗрд╕реЗ рдПрдХ рдЖрд╡реЗрджрди рдореВрд▓реНрдп рдореЗрдВ рд▓рдкреЗрдЯрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рдордиреЗ рд▓рд┐рдЦрд╛ pure = JustрдХреНрдпреЛрдВрдХрд┐ рдореВрд▓реНрдп рдирд┐рд░реНрдорд╛рддрд╛ Justрд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдп рдкреНрд░рддреАрдд рд╣реЛрддреЗ рд╣реИрдВред рд╣рдо рднреА рд▓рд┐рдЦ рд╕рдХрддреЗ рдереЗ pure x = Just xред

рдЕрдВрдд рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдкрд░рд┐рднрд╛рд╖рд╛ рд╣реИ <*>ред рд╣рдо рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдирд╣реАрдВ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ Nothing, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХреЗ рдЕрдВрджрд░ рдХреЛрдИ рдлрд╝рдВрдХреНрд╢рди рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдпрджрд┐ рд╣рдо рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдирд┐рдХрд╛рд▓рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ Nothing, рддреЛ рдкрд░рд┐рдгрд╛рдо рд╣реЛрдЧрд╛ Nothingред рд╡рд░реНрдЧ

рдкрд░рд┐рднрд╛рд╖рд╛ ApplicativeрдореЗрдВ рд╡рд░реНрдЧ рдкреНрд░рддрд┐рдмрдВрдз рд╣реИFunctor, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╣рдо рдорд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рджреЛрдиреЛрдВ рдкреИрд░рд╛рдореАрдЯрд░ рдлрдВрдХреНрд╢рдирд▓ <*>рдорд╛рди рд╣реИрдВред рдпрджрд┐ рдкрд╣рд▓рд╛ рддрд░реНрдХ рдирд╣реАрдВ рд╣реИ Nothing, рд▓реЗрдХрд┐рди JustрдЕрдВрджрд░ рдХреБрдЫ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рд╣реИ, рддреЛ рд╣рдо рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рд╣рдо рджреВрд╕рд░реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдпрд╣ рдХреЛрдб рдЙрд╕ рдорд╛рдорд▓реЗ рдХрд╛ рднреА рдзреНрдпрд╛рди рд░рдЦрддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рджреВрд╕рд░рд╛ рддрд░реНрдХ рд╣реИ NothingрдХреНрдпреЛрдВрдХрд┐ NothingрдХрд┐рд╕реА рднреА рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореИрдкрд┐рдВрдЧ fmapрд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧреА Nothingред рдЗрд╕рд▓рд┐рдП, рдХрд┐рд╕реА Maybeрдлрд╝рдВрдХреНрд╢рди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ , рдпрд╣ <*>рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдмрд╛рдИрдВ рдУрд░ рдорд╛рди рд╕реЗ рдирд┐рдХрд╛рд▓рддрд╛ рд╣реИ, рдпрджрд┐ рдпрд╣ рд╣реИ Just, рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рджрд╛рдИрдВ рдУрд░ рдорд╛рди рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдХреЛрдИ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИ Nothing, рддреЛ рдкрд░рд┐рдгрд╛рдо рд╣реЛрдЧрд╛ Nothingред

рдЪрд▓рд┐рдП рдЕрдм рдЗрд╕реЗ рдЖрдЬрдорд╛рддреЗ рд╣реИрдВ:

 ghci> Just (+3) <*> Just 9 Just 12 ghci> pure (+3) <*> Just 10 Just 13 ghci> pure (+3) <*> Just 9 Just 12 ghci> Just (++"hahah") <*> Nothing Nothing ghci> Nothing <*> Just "woot" Nothing 


рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ pure (+3)рдФрд░ Just (+3)рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ - рдпрд╣ рдПрдХ рд╣реА рдмрд╛рдд рд╣реИред рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ pureрдпрджрд┐ рдЖрдк MaybeрдПрдХ рдЖрд╡реЗрджрди рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ (рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ <*>); рдЕрдиреНрдпрдерд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЫрдбрд╝реА Justред

рдЗрдирдкреБрдЯ рдХреА рдкрд╣рд▓реА рдЪрд╛рд░ рд▓рд╛рдЗрдиреЗрдВ рджрд┐рдЦрд╛рддреА рд╣реИрдВ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреИрд╕реЗ рдирд┐рдХрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдХреЗрд╡рд▓ рдлрдВрдХреНрд╢рдВрд╕ рдореЗрдВ рдЧреИрд░-рд▓рд┐рдкрдЯреЗ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЕрдВрддрд┐рдо рдкрдВрдХреНрддрд┐ рдЗрд╕ рдмрд╛рдд рдореЗрдВ рдЙрддреНрд╕реБрдХ рд╣реИ рдХрд┐ рд╣рдо рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдирд┐рдХрд╛рд▓рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ Nothing, рдФрд░ рдлрд┐рд░ рдЗрд╕рдХреА рд╕рд╣рд╛рдпрддрд╛ рд╕реЗ рдХреБрдЫ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИ Nothingред

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

рдЖрд╡реЗрджрди рд╢реИрд▓реА



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

 ghci> pure (+) <*> Just 3 <*> Just 5 Just 8 ghci> pure (+) <*> Just 3 <*> Nothing Nothing ghci> pure (+) <*> Nothing <*> Just 5 Nothing 


whaleрд╣рдордиреЗ рдлрд╝рдВрдХреНрд╢рди +рдХреЛ рдПрдХ рдПрдкреЗрдЯрд┐рдЯрд┐рд╡ рдорд╛рди рдореЗрдВ рд▓рдкреЗрдЯрд╛ , рдФрд░ рдлрд┐рд░ <*>рдЗрд╕реЗ рджреЛ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ , рдЬреЛ рджреЛрдиреЛрдВ рд╣реА рдРрдкреНрд▓рд┐рдХреЗрд╢рдВрд╕ рд╡реИрд▓реНрдпреВ рд╣реИрдВред

рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рд╣реЛрддрд╛ рд╣реИ, рдХрджрдо рд╕реЗ рдХрджрдоред <*>рдмрд╛рдпрд╛рдВ-рд╕рд╣рдпреЛрдЧреА, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐:
 pure (+) <*> Just 3 <*> Just 5 

рдЗрд╕ рдПрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╣реА:
 (pure (+) <*> Just 3) <*> Just 5 

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдлрд╝рдВрдХреНрд╢рди +рдХреЛ рдПрдкреЗрд░реЗрдЯрд┐рд╡ рд╡реИрд▓реНрдпреВ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╡рд╣ рдорд╛рди MaybeрдЬрд┐рд╕рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ pure (+)рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рд╕рдорд╛рди рд╣реИ Just (+)ред рдЗрд╕рдХреЗ рдмрд╛рдж, рдПрдХ рдХреЙрд▓ рд╣реЛрддрд╛ рд╣реИ Just (+) <*> Just 3ред рдЗрд╕рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИ Just (3+)ред рдпрд╣ рдЖрдВрд╢рд┐рдХ рдЖрд╡реЗрджрди рдХреЗ рдХрд╛рд░рдг рд╣реИред рдХреЗрд╡рд▓ 3рдПрдХ рдлрдВрдХреНрд╢рди рдореЗрдВ +рдЕрдкреНрд▓рд╛рдИ рдХрд░рдиреЗ рд╕реЗ рдПрдХ рдлрдВрдХреНрд╢рди рд▓реМрдЯрддрд╛ рд╣реИ рдЬреЛ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЙрд╕рдореЗрдВ рдЬреБрдбрд╝рддрд╛ рд╣реИ 3ред рдЕрдВрдд рдореЗрдВ, рдпрд╣ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ Just (3+) <*> Just 5, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд░рд┐рдЯрд░реНрди рд╣реЛрддрд╛ рд╣реИ Just 8ред

рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИ ?! рдПрдкреНрд▓рд╛рдЗрдб рдлрдВрдХреНрд╢рдирд▓рд░реНрд╕ рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рдирд▓ рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ рд╕реНрдЯрд╛рдЗрд▓pure f <*> x <*> y <*> ...рдЖрдкрдХреЛ рдРрд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓реЗрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдЙрди рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрдИ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВред рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣рдо рдЬрд┐рддрдиреЗ рдЪрд╛рд╣реЗрдВ рдЙрддрдиреЗ рдкреИрд░рд╛рдореАрдЯрд░ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╣рдореЗрд╢рд╛ рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдШрдЯрдирд╛рдУрдВ рдХреЗ рдмреАрдЪ рдХрджрдо рд╕реЗ рдХрджрдо рд╣реИ <*>ред

рдпрд╣ рдФрд░ рднреА рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдФрд░ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдпрджрд┐ рд╣рдо рдЗрд╕ рддрдереНрдп рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВ рдХрд┐ pure f <*> xрдпрд╣ рд╕рдорд╛рди рд╣реИ fmap fxред рдпрд╣ рд▓рд╛рдЧреВ рдХрд╛рдиреВрдиреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред рд╣рдо рдЗрд╕ рдЕрдзреНрдпрд╛рдп рдореЗрдВ рдмрд╛рдж рдореЗрдВ рдФрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЖрд╡реЗрджрдХ рдХрд╛рдиреВрдиреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдЖрдЗрдП рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪреЗрдВ рдХрд┐ рдпрд╣ рдпрд╣рд╛рдВ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИредpureрдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕рдВрджрд░реНрдн рдореЗрдВ рдорд╛рди рдбрд╛рд▓рддрд╛ рд╣реИред рдпрджрд┐ рд╣рдо рдХреЗрд╡рд▓ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕рдВрджрд░реНрдн рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдлрд╝рдВрдХреНрд╢рдирд▓ рдХреЗ рдЕрдВрджрд░ рдорд╛рди рдкрд░ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдЗрд╕ рдРрдкреНрд▓рд┐рдХреЗрдЯрд░ рдлрд╝рдВрдХреНрдЯрд░ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд╕рдорд╛рди рд╣реА рд╣реЛрдЧрд╛ред рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрдЬрд╛рдп pure f <*> x <*> y <*> ..., рд╣рдо рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ fmap fx <*> y <*> ...ред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдпрд╣ Control.ApplicativeрдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдирд┐рд░реНрдпрд╛рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ <$>, рдЬреЛ рдХрд┐ fmapрдЗрдиреНрдлрд┐рдХреНрд╕ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд┐рд░реНрдл рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИред рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
 (<$>) :: (Functor f) => (a -> b) -> fa -> fb f <$> x = fmap fx 


рдиреЛрдЯ : рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдЪрд░ рдкреНрд░рдХрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ рдирд╛рдореЛрдВ рдпрд╛ рдЕрдиреНрдп рдореВрд▓реНрдпреЛрдВ рдХреЗ рдирд╛рдореЛрдВ рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рд╣реИрдВред рдпрд╣рд╛рдВ fрдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдШреЛрд╖рдгрд╛ рдПрдХ рд╡рд░реНрдЧ рдмрд╛рдзрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЪрд░ рд╣реИ, рдЬреЛ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдЬреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ fрд╣реИ рд╡рд╣ рдкреНрд░рдХрд╛рд░ рд╡рд░реНрдЧ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП Functorред fрдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдореБрдЦреНрдп рднрд╛рдЧ рдЙрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╣рдо рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддреЗ рд╣реИрдВ xред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо fрджреЛрдиреЛрдВ рдЪреАрдЬреЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреЗ рдереЗ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡реЗ рдПрдХ рд╣реА рдЪреАрдЬ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреЗ рд╣реИрдВред

рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, <$>рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╢реИрд▓реА рдЕрдкрдиреЗ рд╕рднреА рдорд╣рд┐рдорд╛ рдореЗрдВ рдкреНрд░рдХрдЯ рд╣реЛрддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдм рдЕрдЧрд░ рд╣рдо fрддреАрди рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдмрд╕ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВf <$> x <*> y <*> zред рдпрджрд┐ рдкреИрд░рд╛рдореАрдЯрд░ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рди рдереЗ, рддреЛ рд╣рдо рд▓рд┐рдЦреЗрдВрдЧреЗ fxyzред

рдЖрдЗрдП рдЗрд╕ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдо рдорд╛рди рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ Just "johntra"рдФрд░ Just "volta"рдПрдХ рдкрдВрдХреНрддрд┐ рдПрдХ functor рдХреЗ рдЕрдВрджрд░ рд╣реИ рдХрд┐ рдореЗрдВ Maybeред рд╣рдо рдпрд╣ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
 ghci> (++) <$> Just "johntra" <*> Just "volta" Just "johntravolta" 

рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рд╣реЛрддрд╛ рд╣реИ, рдкрд┐рдЫрд▓реА рдкрдВрдХреНрддрд┐ рдХреА рддреБрд▓рдирд╛ рдЗрд╕ рд╕реЗ рдХрд░реЗрдВ:
 ghci> (++) "johntra" "volta" "johntravolta" 

applicatives рд╕рд╛рде рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕рдорд╛рд░реЛрд╣ рдореЗрдВ рдХреБрдЫ рдЪрд╛рд░реЛрдВ рдУрд░ рд╕рд┐рд░реНрдл рдмрд┐рдЦрд░рд╛рд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ <$>рдФрд░ <*>, рдФрд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧреА рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧреА рдорд╛рди рдкреНрд░рджрд╛рди рдХрд░реЗрдВрдЧреЗред рдХреНрдпрд╛ рдпрд╣ рдорд╣рд╛рди рдирд╣реАрдВ рд╣реИ?

рд╣рдорд╛рд░реА рдУрд░ рд▓реМрдЯрдирд╛ (++) <$> Just "johntra" <*> Just "volta": рдкрд╣рд▓рд╛ (++), рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ (++) :: [a] -> [a] -> [a]рдбрд┐рд╕реНрдкреНрд▓реЗ рд╣реЛрддрд╛ рд╣реИ Just "johntra"ред рдпрд╣ Just ("johntra"++)рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдореВрд▓реНрдп рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рд╣реИ Maybe ([Char] -> [Char])ред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди (++)рдХрд╛ рдкрд╣рд▓рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдХреИрд╕реЗ рдЦрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдпрд╣ aрдореВрд▓реНрдпреЛрдВ рдореЗрдВ рдХреИрд╕реЗ рдмрджрд▓ рдЧрдпрд╛ Charред рдФрд░ рдЕрдм рдПрдХ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ Just ("johntra"++) <*> Just "volta"рд╣реИ рдЬреЛ рдлрд╝рдВрдХреНрд╢рди рдХреЛ JustрдЕрдкрдиреА рд╕рд╣рд╛рдпрддрд╛ рд╕реЗ рдирд┐рдХрд╛рд▓рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ Just "volta", рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк Just "johntravolta"ред рдпрджрд┐ рджреЛ рдореЗрдВ рд╕реЗ рдПрдХ рдорд╛рди Nothingрд╣реЛрддрд╛, рддреЛ рдкрд░рд┐рдгрд╛рдо рднреА рд╣реЛрддрд╛Nothing ред

рд╕реВрдЪрд┐рдпреЛрдВ


рд╕реВрдЪрд┐рдпрд╛рдБ (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╕реВрдЪреА рдкреНрд░рдХрд╛рд░ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ []) , рдЖрд╡реЗрджрдХ рдлрдВрдХреНрд╢рдирд▓ рд╣реИрдВред рдХреНрдпрд╛ рдЖрд╢реНрдЪрд░реНрдп рд╣реИ! рдФрд░ рдпрд╣рд╛рдБ []рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ Applicative:
 instance Applicative [] where pure x = [x] fs <*> xs = [fx | f <- fs, x <- xs] 

рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдпрд╣ pureрдПрдХ рдореВрд▓реНрдп рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕рдВрджрд░реНрдн рдореЗрдВ рд░рдЦрддрд╛ рд╣реИред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдпрд╣ рдЗрд╕реЗ рдПрдХ рдиреНрдпреВрдирддрдо рд╕рдВрджрд░реНрдн рдореЗрдВ рд░рдЦрддрд╛ рд╣реИ рдЬреЛ рдЕрднреА рднреА рдЗрд╕ рдореВрд▓реНрдп рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддрд╛ рд╣реИред рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдиреНрдпреВрдирддрдо рд╕рдВрджрд░реНрдн рдПрдХ рдЦрд╛рд▓реА рд╕реВрдЪреА рд╣реЛрдЧреА, рд▓реЗрдХрд┐рди рдПрдХ рдЦрд╛рд▓реА рд╕реВрдЪреА рдХрд╛ рдорддрд▓рдм рдХреЛрдИ рдореВрд▓реНрдп рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдореЗрдВ рд╡рд╣ рдореВрд▓реНрдп рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕ рдкрд░ рд╣рдордиреЗ рдЖрд╡реЗрджрди рдХрд┐рдпрд╛ рдерд╛ pureред рдЗрд╕рд▓рд┐рдП рдпрд╣ pureрдПрдХ рдореВрд▓реНрдп рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдПрдХ рд╕рд┐рдВрдЧрд▓рдЯрди рд╕реВрдЪреА рдореЗрдВ рд░рдЦрддрд╛ рд╣реИред рдЗрд╕реА рдкреНрд░рдХрд╛рд░, рдЖрд╡реЗрджрдХ рдлрдВрдХреНрд╢рдирд▓ рдХреЗ рд▓рд┐рдП рдиреНрдпреВрдирддрдо рд╕рдВрджрд░реНрдн Maybeрд╣реЛрдЧрд╛ Nothing, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдореВрд▓реНрдп рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдореВрд▓реНрдп рдХрд╛ рдЕрднрд╛рд╡ рд╣реИ, рдЗрд╕рд▓рд┐рдП, pureрдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреЗ рд▓рд┐рдП MaybeрдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ Justред

рдпрд╣рд╛рдБ pureрдХрд╛рд░реНрд░рд╡рд╛рдИ рд╣реИ:
 ghci> pure "Hey" :: [String] ["Hey"] ghci> pure "Hey" :: Maybe String Just "Hey" 

рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ <*>? рдпрджрд┐ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкреНрд░рдХрд╛рд░ <*>рдХреЗрд╡рд▓ рд╕реВрдЪрд┐рдпреЛрдВ рддрдХ рд╕реАрдорд┐рдд рдерд╛, рддреЛ рд╣рдореЗрдВ рдорд┐рд▓реЗрдЧрд╛ (<*>) :: [a -> b] -> [a] -> [b]ред рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рд╕реВрдЪреА рдЬрдирд░реЗрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред <*>рдХрд┐рд╕реА рддрд░рд╣ рдЕрдкрдиреЗ рдмрд╛рдПрдВ рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдирд┐рдХрд╛рд▓рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдлрд┐рд░ рдЗрд╕рдХреА рдорджрдж рд╕реЗ рд╕рд╣реА рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВред рд▓реЗрдХрд┐рди рдмрд╛рдИрдВ рд╕реВрдЪреА рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдпрд╛ рдХрдИ рдлрд╝рдВрдХреНрд╢рди рд╢рд╛рдорд┐рд▓ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд╕рд╣реА рд╕реВрдЪреА рдореЗрдВ рдХрдИ рдорд╛рди рднреА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╣рдо рджреЛрдиреЛрдВ рд╕реВрдЪреА рд╕реЗ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реВрдЪреА рдЬрдирд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдмрд╛рдИрдВ рд╕реВрдЪреА рд╕реЗ рд╣рд░ рд╕рдВрднрд╡ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕рд╣реА рд╕реВрдЪреА рд╕реЗ рд╣рд░ рд╕рдВрднрд╡ рдорд╛рди рдкрд░ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред рдкрд░рд┐рдгрд╛рдореА рд╕реВрдЪреА рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдмрд╛рдИрдВ рд╕реВрдЪреА рд╕реЗ рджрд╛рдИрдВ рдУрд░ рдорд╛рди рдкрд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдВрдпреЛрдЬрди рд╢рд╛рдорд┐рд▓ рд╣реИрдВред

рд╣рдо <*>рдЗрд╕ рддрд░рд╣ рдХреА рд╕реВрдЪреА рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ :
 ghci> [(*0),(+100),(^2)] <*> [1,2,3] [0,0,0,101,102,103,1,4,9] 

рдмрд╛рдИрдВ рд╕реВрдЪреА рдореЗрдВ рддреАрди рдлрд╝рдВрдХреНрд╢рди рд╣реИрдВ, рдФрд░ рд╕рд╣реА рд╕реВрдЪреА рдореЗрдВ рддреАрди рдорд╛рди рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдкрд░рд┐рдгрд╛рдореА рд╕реВрдЪреА рдореЗрдВ рдиреМ рддрддреНрд╡ рд╣реЛрдВрдЧреЗред рдмрд╛рдИрдВ рд╕реВрдЪреА рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рджрд╛рдИрдВ рдУрд░ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд▓реЗрдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИ, рддреЛ рд╣рдо рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рджреЛ рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рдмреАрдЪ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо рджреЛ рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рдмреАрдЪ рджреЛ рдХрд╛рд░реНрдп рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ:
 ghci> [(+),(*)] <*> [1,2] <*> [3,4] [4,5,5,6,3,4,6,8] 

<*>рдмрд╛рдПрдВ-рд╕рд╛рд╣рдЪрд░реНрдп рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдкрд╣рд▓реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ [(+),(*)] <*> [1,2], рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЙрд╕реА рдХреА рдПрдХ рд╕реВрдЪреА рд╣реЛрддреА рд╣реИ [(1+),(2+),(1*),(2*)], рдХреНрдпреЛрдВрдХрд┐ рдмрд╛рдИрдВ рдУрд░ рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рджрд╛рдИрдВ рдУрд░ рдкреНрд░рддреНрдпреЗрдХ рдорд╛рди рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдлрд┐рд░ рдЗрд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд [(1+),(2+),(1*),(2*)] <*> [3,4]рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИред

рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдЖрд╡реЗрджрди рд╢реИрд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ!
 ghci> (++) <$> ["ha","heh","hmm"] <*> ["?","!","."] ["ha?","ha!","ha.","heh?","heh!","heh.","hmm?","hmm!","hmm."] 

, , , , .

. 100 "what" , , [1,2,3] , , , . - (+) <$> [1,2,3] <*> [4,5,6] , + , , .

рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдЖрд╡реЗрджрди рд╢реИрд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрдХреНрд╕рд░ рд╕реВрдЪреА рдЬрдирд░реЗрдЯрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реЛрддрд╛ рд╣реИред рдЕрдзреНрдпрд╛рдп 1 рдореЗрдВ, рд╣рдо рдХрд╛рдореЛрдВ рдХреЗ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдВрдпреЛрдЬрдиреЛрдВ рдХреЛ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рдереЗ [2,5,10]рдФрд░ [8,10,11]рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ рдпрд╣ рдХрд┐рдпрд╛:
 ghci> [ x*y | x <- [2,5,10], y <- [8,10,11]] [16,20,22,40,50,55,80,100,110] 

рд╣рдо рдмрд╕ рджреЛрдиреЛрдВ рд╕реВрдЪрд┐рдпреЛрдВ рд╕реЗ рдорд╛рди рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВ рдФрд░ рддрддреНрд╡реЛрдВ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрдпреЛрдЬрди рдХреЗ рдмреАрдЪ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдПрдХ рдЖрд╡реЗрджрди рд╢реИрд▓реА рдореЗрдВ рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

 ghci> (*) <$> [2,5,10] <*> [8,10,11] [16,20,22,40,50,55,80,100,110] 


рдореЗрд░реЗ рд▓рд┐рдП, рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЕрдзрд┐рдХ рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рдордЭрдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рд╣рдо рдХреЗрд╡рд▓ *рджреЛ рдЧреИрд░-рдирд┐рдпрддрд╛рддреНрдордХ рдЧрдгрдирд╛рдУрдВ рдХреЗ рдмреАрдЪ рдХреНрдпрд╛ рдХрд╣рддреЗ рд╣реИрдВ ред рдпрджрд┐ рд╣рдо рдЗрди рджреЛ рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рддрддреНрд╡реЛрдВ рдХреЗ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдЙрддреНрдкрд╛рджреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдмрдбрд╝реЗ 50, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:

 ghci> filter (>50) $ (*) <$> [2,5,10] <*> [8,10,11] [55,80,100,110] 


рдпрд╣ рджреЗрдЦрдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ pure f <*> xsрд╕реВрдЪрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдХреЙрд▓ рд╕рдордХрдХреНрд╖ рд╣реИ fmap f xsред pure f- рдпрд╣ рд╕рд░рд▓ рд╣реИ [f], рд▓реЗрдХрд┐рди рдпрд╣ [f] <*> xsрдмрд╛рдИрдВ рд╕реВрдЪреА рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рджрд╛рдИрдВ рдУрд░ рдкреНрд░рддреНрдпреЗрдХ рдорд╛рди рдкрд░ рд▓рд╛рдЧреВ рдХрд░реЗрдЧрд╛ , рд▓реЗрдХрд┐рди рдмрд╛рдИрдВ рд╕реВрдЪреА рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдПрдХ рдкреНрд░рджрд░реНрд╢рди рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИред

IO рдПрдХ рдПрдкреЗрдХреНрдЯрд┐рд╡ рдлрдВрдХреНрдЯрд░ рднреА рд╣реИ



рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг ApplicativeрдЬреЛ рд╣рдореЗрдВ рдкрд╣рд▓реЗ рд╣реА рдорд┐рд▓ рдЪреБрдХрд╛ рд╣реИ IOред рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
 instance Applicative IO where pure = return a <*> b = do f <- a x <- b return (fx) 

knight
рдЪреВрдВрдХрд┐ рд╕рд╛рд░ pureрдПрдХ рдиреНрдпреВрдирддрдо рд╕рдВрджрд░реНрдн рдореЗрдВ рдореВрд▓реНрдп рд░рдЦрдирд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЕрднреА рднреА рдореВрд▓реНрдп рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реИ рдХрд┐ pureрдпрд╣ рд╕рд░рд▓ рд╣реИ returnред returnI / O рдХреНрд░рд┐рдпрд╛ рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдмрд┐рдирд╛ рдХрд┐рд╕реА I / O рдСрдкрд░реЗрд╢рдВрд╕ рдЬреИрд╕реЗ рдХрд┐рд╕реА рдЯрд░реНрдорд┐рдирд▓ рдкрд░ рдкреНрд░рд┐рдВрдЯрд┐рдВрдЧ рдпрд╛ рдХрд┐рд╕реА рдлрд╛рдЗрд▓ рд╕реЗ рдкрдврд╝рдиреЗ рдХреЗ рдмрд┐рдирд╛, рдЗрд╕рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рдХреБрдЫ рдореВрд▓реНрдп рджреЗрддрд╛ рд╣реИред

рдЕрдЧрд░ рдореИрдВ <*>рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рддрдХ рд╕реАрдорд┐рдд рд░рд╣рддрд╛ IO, рддреЛ рдЙрд╕рдХреЗ рдкрд╛рд╕ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реЛрддрд╛ (<*>) :: IO (a -> b) -> IO a -> IO bред рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, IOрдпрд╣ рдПрдХ I / O рдХрд╛рд░реНрд░рд╡рд╛рдИ aрдХрд░рддрд╛ рд╣реИ рдЬреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рджреЗрддрд╛ рд╣реИ, рдПрдХ I / O рдХреНрд░рд┐рдпрд╛ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕рдВрдмрджреНрдз рдХрд░рддрд╛ рд╣реИ fред рд╡рд╣ рдлрд┐рд░ I / O рдХреНрд░рд┐рдпрд╛ рдХрд░рддреА рд╣реИ bрдФрд░ рдЗрд╕рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рд╕рдВрдмрджреНрдз рдХрд░рддреА рд╣реИ xред рдЕрдВрдд рдореЗрдВ, рд╡рд╣ рдлрдВрдХреНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреА рд╣реИfрдХрд╢реНрдореАрд░ xрдФрд░ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕ рдЖрд╡реЗрджрди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИред рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ рдпрд╣рд╛рдБ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ doред (рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ doрдХрд╛ рд╕рд╛рд░ рдХрдИ I / O рдХреНрд░рд┐рдпрд╛рдПрдБ рд▓реЗрдирд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдПрдХ рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдПрдХ рд╕рд╛рде рдЧреЛрдВрдж рдХрд░рдирд╛ рд╣реИред)

рдЬрдм рд╣рдо рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ MaybeрдФрд░, []рд╣рдо рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЛ <*>рдЙрд╕рдХреЗ рдмрд╛рдПрдВ рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдирд┐рдХрд╛рд▓рдиреЗ рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рджрд╛рдИрдВ рдУрд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рдкреИрд░рд╛рдореАрдЯрд░ред рд╕рдореНрдорд╛рди рдХреЗ рд╕рд╛рдеIOрдирд┐рд╖реНрдХрд░реНрд╖рдг рд╡реИрдз рд░рд╣рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрд╕реЗ рдЕрдиреБрдХреНрд░рдо рдореЗрдВ рд░рдЦрдиреЗ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рджреЛ I / O рдХреНрд░рд┐рдпрд╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдПрдХ рдореЗрдВ рдЧреЛрдВрдж рдХрд░рддреЗ рд╣реИрдВред рд╣рдореЗрдВ рдкрд╣рд▓реЗ I / O рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдлрд╝рдВрдХреНрд╢рди рдирд┐рдХрд╛рд▓рдирд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди I / O рдХрд╛рд░реНрд░рд╡рд╛рдИ рд╕реЗ рдкрд░рд┐рдгрд╛рдо рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╛рдж рдореЗрдВ рдкреНрд░рджрд░реНрд╢рди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

 myAction :: IO String myAction = do a <- getLine b <- getLine return $ a ++ b 


рдпрд╣ рдПрдХ I / O рдХреНрд░рд┐рдпрд╛ рд╣реИ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗ рджреЛ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкреВрдЫрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рдЗрди рджреЛ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рдВрдШрдЯрди рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддрд╛ рд╣реИред рд╣рдордиреЗ рдЗрд╕реЗ рджреЛ I / O рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдПрдХ рд╕рд╛рде рдЪрд┐рдкрдХрд╛рдХрд░ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ getLineрдФрд░ return, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реА рдирдИ рдЪрд┐рдкрдХреА I / O рдХрд╛рд░реНрд░рд╡рд╛рдИ рдЪрд╛рд╣рддреЗ рдереЗ a ++ bред рдЗрд╕реЗ рд╡рд░реНрддрдиреА рдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рддрд░реАрдХрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЖрд╡реЗрджрди рд╢реИрд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:

 myAction :: IO String myAction = (++) <$> getLine <*> getLine 


рдпрд╣ рд╡рд╣реА рдЪреАрдЬ рд╣реИ рдЬреЛ рд╣рдордиреЗ рдкрд╣рд▓реЗ рдХреА рдереА рдЬрдм рд╣рдордиреЗ I / O рдПрдХреНрд╢рди рдмрдирд╛рдпрд╛ рдерд╛ рдЬрд┐рд╕рдиреЗ рджреЛ рдЕрдиреНрдп I / O рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдмреАрдЪ рдПрдХ рдлрдВрдХреНрд╢рди рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдерд╛ред рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ getLineрдпрд╣ рдПрдХ I / O рдХреНрд░рд┐рдпрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рд╣реИ getLine :: IO Stringред рдЬрдм рд╣рдо <*>рджреЛ рдЖрд╡реЗрджрди рдореВрд▓реНрдпреЛрдВ рдХреЗ рдмреАрдЪ рдЖрд╡реЗрджрди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдкрд░рд┐рдгрд╛рдо рдПрдХ рд▓рд╛рдЧреВ рдореВрд▓реНрдп рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рд╕рднреА рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред

рдпрджрд┐ рд╣рдо рдмреЙрдХреНрд╕ рдХреЗ рдЕрдиреБрд░реВрдк рд╡рд╛рдкрд╕ рд▓реМрдЯрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЗрд╕реЗ getLineрдПрдХ рдмреЙрдХреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреБрдирд┐рдпрд╛ рдореЗрдВ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╣рдореЗрдВ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд▓рд╛рддрд╛ рд╣реИред рдирд┐рд╖реНрдкрд╛рджрди (++) <$> getLine <*> getLineрдПрдХ рдФрд░ рдмрдбрд╝рд╛ рдмреЙрдХреНрд╕ рдмрдирд╛рддрд╛ рд╣реИ, рдЬреЛ рдЯрд░реНрдорд┐рдирд▓ рд╕реЗ рддрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рдмрдХреНрд╕реЗ рдХреЛ рднреЗрдЬрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЗрди рджреЛ рддрд╛рд░реЛрдВ рдХреЗ рд╕рдВрдШрдирди рдХреЛ рдЗрд╕рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд╛рдкрд╕ рдХрд░рддрд╛ рд╣реИред

рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ (++) <$> getLine <*> getLineрдкреНрд░рдХрд╛рд░ рдХреА рд╣реИIO Stringред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдЗрдирдкреБрдЯ-рдЖрдЙрдЯрдкреБрдЯ рдПрдХреНрд╢рди рд╣реИ, рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рдХреА рддрд░рд╣, рдкрд░рд┐рдгрд╛рдо рднреА рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдЕрдиреНрдп рдЗрдирдкреБрдЯ-рдЖрдЙрдЯрдкреБрдЯ рдПрдХреНрд╢рди рдХреА рддрд░рд╣ред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╣рдо рдРрд╕реА рдЪреАрдЬреЗрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 main = do a <- (++) <$> getLine <*> getLine putStrLn $ "The two lines concatenated turn out to be: " ++ a 


рдПрдкреНрд▓рд╛рдПрдВрд╕рд┐рд╡ рдлрдВрдХреНрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп



рдПрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдг Applicativeрд╣реИ (->) rрдпрд╛ рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдЕрдХреНрд╕рд░ рдЖрд╡реЗрджрди рд╢реИрд▓реА рдореЗрдВ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрд╡рдзрд╛рд░рдгрд╛ рдЕрднреА рднреА рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рддреЛ рдЪрд▓рд┐рдП рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓рддреЗ рд╣реИрдВ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдЖрд╡реГрддреНрддрд┐ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХреА рдЬрд╛рддреА рд╣реИред

 instance Applicative ((->) r) where pure x = (\_ -> x) f <*> g = \x -> fx (gx) 


рдЬрдм рд╣рдо рдХрд┐рд╕реА рд╡реИрд▓реНрдпреВ рдХреЛ рдПрдХ рд╡реИрд▓реНрдпреВрдПрдЯрд┐рд╡ рд╡реИрд▓реНрдпреВ рдХреЗ рд╕рд╛рде рд▓рдкреЗрдЯрддреЗ рд╣реИрдВ pure, рддреЛ рдЗрд╕рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдпрд╣ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡реИрд▓реНрдпреВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдиреНрдпреВрдирддрдо рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕рдВрджрд░реНрдн рдЕрднреА рднреА рдЗрд╕ рдореВрд▓реНрдп рдХреЛ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдЗрд╕реАрд▓рд┐рдП, рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рдпрд╣ pureрдПрдХ рдорд╛рди рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ рдЙрд╕ рдкрд░ рджрд┐рдП рдЧрдП рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╣рдореЗрд╢рд╛ рдЙрд╕ рдорд╛рди рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИред pureрдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдкреНрд░рдХрд╛рд░ (->) rрджрд┐рдЦрддрд╛ рд╣реИ pure :: a -> (r -> a)ред

 ghci> (pure 3) "blah" 3 


рдХрд░реАрдиреЗ рдХреЗ рдХрд╛рд░рдг, рдлрд╝рдВрдХреНрд╢рди рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдмрд╛рдПрдВ-рд╕рд╛рд╣рдЪрд░реНрдп рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдХреЛрд╖реНрдардХ рдХреЛ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ:

 ghci> pure 3 "blah" 3 


рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди <*>рдереЛрдбрд╛ рдЧреВрдврд╝ рд╣реИ, рддреЛ рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдХреИрд╕реЗ рдПрдХ рдЖрд╡реЗрджрдХ рд╢реИрд▓реА рдореЗрдВ рдЖрд╡реЗрджрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдП:

 ghci> :t (+) <$> (+3) <*> (*100) (+) <$> (+3) <*> (*100) :: (Num a) => a -> a ghci> (+) <$> (+3) <*> (*100) $ 5 508 


<*>рджреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡реИрд▓реНрдпреВ рдХреЗ рд╕рд╛рде рдПрдХ рдлрдВрдХреНрд╢рди рдХреЙрд▓ рдПрдХ рдПрдкреЗрдХреНрдЯрд┐рд╡ рд╡реИрд▓реНрдпреВ рджреЗрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЕрдЧрд░ рд╣рдо рдЗрд╕реЗ рджреЛ рдлрдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдХрд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдПрдХ рдлрдВрдХреНрд╢рди рдорд┐рд▓рддрд╛ рд╣реИред рдпрд╣рд╛рдВ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ? рдЬрдм рд╣рдо рдХрд░рддреЗ рд╣реИрдВ (+) <$> (+3) <*> (*100), рд╣рдо рдПрдХ рд╕рдорд╛рд░реЛрд╣ рд╣реИ рдХрд┐ рд▓рд╛рдЧреВ рд╣реЛрдЧреА рдмрдирд╛рдиреЗ рдХреЗ +рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд▓рд┐рдП (+3)рдФрд░ (*100)рдФрд░ рдХрд╣рд╛ рдХрд┐ рдореВрд▓реНрдп рд╡рд╛рдкрд╕ред рдЬрдм рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (+) <$> (+3) <*> (*100) $ 5, (+3)рдФрд░ (*100)рдкрд╣рд▓реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ 5, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк 8рдФрд░ рд╣реЛрддрд╛ рд╣реИ 500ред рдлрд┐рд░ рдЗрд╕реЗ +рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ 8рдФрд░ 500, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╣реЛрддрд╛ рд╣реИ 508ред

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рд╕рдорд╛рди рд╣реИ:

 ghci> (\xyz -> [x,y,z]) <$> (+3) <*> (*2) <*> (/2) $ 5 [8.0,10.0,2.5] 


jazzbрд╣рдо рдПрдХ рд╕рдорд╛рд░реЛрд╣ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдмрдирд╛рдиреЗ рдХреЗ \xyz -> [x, y, z]рд╕рдорд╛рд░реЛрд╣ рд╕реЗ рд╡рд╛рдкрд╕ рд▓реМрдЯреЗ рдЕрдВрддрд┐рдо рдкреНрд░рджрд░реНрд╢рди рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рд╕рд╛рде (+3), (*2)рдФрд░ (/2)ред 5рддреАрди рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЗрди рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рдмреБрд▓рд╛рдпрд╛ \xyz -> [x, y, z]ред

рдиреЛрдЯ : рдпрджрд┐ рдЖрдк рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ (->) rрд╣реИ Applicative, рддреЛ рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдЕрднреА рдирд╣реАрдВ рд╕рдордЭрддреЗ рд╣реИрдВ рддреЛ рдирд┐рд░рд╛рд╢рд╛ рди рдХрд░реЗрдВред рдЖрд╡реЗрджрдХ рд╢реИрд▓реА рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдЦреЗрд▓рддреЗ рд╣реИрдВ рдХрд┐ рдХреИрд╕реЗ рдЖрд╡реЗрджрдХ рдлрдВрдХреНрд╢рдирд▓рд░реНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╡рд┐рдЪрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред

рдЬрд╝рд┐рдкрд┐рдд рд╕реВрдЪреА



, . : <*> , .

, [(+3),(*2)] <*> [1,2] , (+3) 1 2 , (*2) 1 2 , : [4,5,2,4] . , [(+3),(*2)] <*> [1,2] , , , . . : [4,4]ред рдЖрдк рдЗрд╕рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ [1 + 3, 2 * 2]ред

рд╡рд╣ рдЙрджрд╛рд╣рд░рдг рдЬреЛ Applicativeрд╣рдореЗрдВ рдЕрднреА рддрдХ рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИ ZipList, рдФрд░ рд╡рд╣ рдЕрдВрджрд░ рд░рд╣рддрд╛ рд╣реИ Control.Applicativeред

рдЪреВрдВрдХрд┐ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рджреЛ рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдПрдХ рдкреНрд░рдХрд╛рд░ рдкреЗрд╢ ZipList aрдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдЬрд┐рд╕рдореЗрдВ (ZipList)рдПрдХ рдПрдХрд▓ рдлрд╝реАрд▓реНрдб (рд╕реВрдЪреА) рдХреЗ рд╕рд╛рде рдПрдХ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╣реИ ред рдпрд╣рд╛рдБ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ:

 instance Applicative ZipList where pure x = ZipList (repeat x) ZipList fs <*> ZipList xs = ZipList (zipWith (\fx -> fx) fs xs) 


<*>рдкрд╣рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд╣рд▓реЗ рдорд╛рди рдкрд░ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рджреВрд╕рд░реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рджреВрд╕рд░реЗ рдорд╛рди рдкрд░, рдЖрджрд┐ рдХреЗ рд╕рд╛рде рдпрд╣ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ zipWith (\fx -> fx) fs xsред рдиреМрдХрд░реА рдХреА рдкреНрд░рдХреГрддрд┐ рдХреЗ рдХрд╛рд░рдг, zipWithрдЕрдВрддрд┐рдо рд╕реВрдЪреА рджреЛрдиреЛрдВ рдХреА рдЫреЛрдЯреА рд╕реВрдЪреА рдХреЗ рд╕рдорд╛рди рд╣реЛрдЧреАред

pureрдпрд╣рд╛рдБ рднреА рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред рд╡рд╣ рдПрдХ рдореВрд▓реНрдп рд▓реЗрддреА рд╣реИ рдФрд░ рдЗрд╕реЗ рдПрдХ рд╕реВрдЪреА рдореЗрдВ рдбрд╛рд▓рддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╡рд╣ рдореВрд▓реНрдп рд╕рд░рд▓рддрд╛ рд╕реЗ рджреЛрд╣рд░рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред pure "haha"рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдЧрд╛ ZipList (["haha","haha","haha"...ред рдпрд╣ рднреНрд░рд╛рдордХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдкрдиреЗ рд╕реАрдЦрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ pureрдПрдХ рдиреНрдпреВрдирддрдо рд╕рдВрджрд░реНрдн рдореЗрдВ рдПрдХ рдореВрд▓реНрдп рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдЕрднреА рднреА рдЙрд╕ рдореВрд▓реНрдп рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддрд╛ рд╣реИред рдФрд░ рдЖрдк рд╕реЛрдЪреЗрдВрдЧреЗ рдХрд┐ рдХрд┐рд╕реА рднреА рдЪреАрдЬ рдХреА рдЕрдВрддрд╣реАрди рд╕реВрдЪреА рд╢рд╛рдпрдж рд╣реА рдХрдо рд╣реЛред рд▓реЗрдХрд┐рди рдЬрд╝рд┐рдкрд┐рдд рд╕реВрдЪрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдпрд╣ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдореВрд▓реНрдп рдХрд╛ рдЙрддреНрдкрд╛рджрди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдХрд╛рдиреВрди рдХрд╛ рдЕрдиреБрдкрд╛рд▓рди рднреА рдХрд░рддрд╛ рд╣реИpure f <*> xsрд╕рдордХрдХреНрд╖ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП fmap f xsред рдпрджрд┐ рдХреЙрд▓ pure 3рдХреЗрд╡рд▓ рд╡рд╛рдкрд╕ рдЖрддреА рд╣реИ ZipList [3], рддреЛ рдХреЙрд▓ pure (*2) <*> ZipList [1,5,10]рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реЛрдЧрд╛ ZipList [2], рдХреНрдпреЛрдВрдХрд┐ рджреЛ рдЬрд╝рд┐рдкрд┐рдд рд╕реВрдЪрд┐рдпреЛрдВ рдХреА рдкрд░рд┐рдгрд╛рдореА рд╕реВрдЪреА рдХреА рд▓рдВрдмрд╛рдИ рджреЛ рдХреА рдЫреЛрдЯреА рд╕реВрдЪреА рдХреА рд▓рдВрдмрд╛рдИ рд╣реИред рдпрджрд┐ рд╣рдо рдЕрдирдВрдд рдХреЗ рд╕рд╛рде рдПрдХ рдкрд░рд┐рдорд┐рдд рд╕реВрдЪреА рдХреЛ рдЬрд╝рд┐рдк рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдкрд░рд┐рдгрд╛рдореА рд╕реВрдЪреА рдХреА рд▓рдВрдмрд╛рдИ рд╣рдореЗрд╢рд╛ рдЕрдВрддрд┐рдо рд╕реВрдЪреА рдХреА рд▓рдВрдмрд╛рдИ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдЧреАред

рддреЛ рдХреИрд╕реЗ рдЬрд╝рд┐рдкрд┐рдд рд╕реВрдЪрд┐рдпрд╛рдБ рдПрдХ рдЖрд╡реЗрджрди рд╢реИрд▓реА рдореЗрдВ рдХрд╛рдо рдХрд░рддреА рд╣реИрдВ? рдЖрдЗрдП рджреЗрдЦрддреЗ рд╣реИрдВред рдЦреИрд░, рдкреНрд░рдХрд╛рд░ ZipList aрдореЗрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ Show, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди getZipListрдХрд╛ рдЙрдкрдпреЛрдЧ рдЬрд╝рд┐рдкрд┐рдд рд╕реВрдЪреА рд╕реЗ рдХрдЪреНрдЪреА рд╕реВрдЪреА рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП :

 ghci> getZipList $ (+) <$> ZipList [1,2,3] <*> ZipList [100,100,100] [101,102,103] ghci> getZipList $ (+) <$> ZipList [1,2,3] <*> ZipList [100,100..] [101,102,103] ghci> getZipList $ max <$> ZipList [1,2,3,4,5,3] <*> ZipList [5,3,1,2] [5,3,3,4] ghci> getZipList $ (,,) <$> ZipList "dog" <*> ZipList "cat" <*> ZipList "rat" [('d','c','r'),('o','a','a'),('g','t','t')] 


рдиреЛрдЯ : рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ (,,)рд░реВрдк рдореЗрдВ рд╣реА рд╣реИ \xyz -> (x,y,z)ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ (,)рд░реВрдк рдореЗрдВ рд╣реА рд╣реИ \xy -> (x,y)ред

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

рд▓рд╛рдЧреВ рдХрд╛рдиреВрди



рд╕рд╛рдзрд╛рд░рдг рдлрдВрдХреНрд╢рдирд▓рд░реНрд╕ рдХреА рддрд░рд╣, рдРрдкреНрд▓реАрдХреЗрдВрдЯ рдлрдВрдХреНрд╢рдирд▓рд░реНрд╕ рдЕрдкрдиреЗ рд╕рд╛рде рдХрдИ рдХрд╛рдиреВрди рд▓реЗрдХрд░ рдЬрд╛рддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрд╛рдиреВрди рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИ pure f <*> x = fmap fxред рдПрдХ рдЕрднреНрдпрд╛рд╕ рдХреЗ рд░реВрдк рдореЗрдВ, рдЖрдк рдЗрд╕ рдЕрдзреНрдпрд╛рдп рдореЗрдВ рдХреБрдЫ рдЖрд╡реЗрджрдХ рдлрдВрдХреНрд╢рдВрд╕ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдХрд╛рдиреВрди рдХреА рдкреВрд░реНрддрд┐ рд╕рд╛рдмрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдиреНрдп рдЖрд╡реЗрджрдХ рдХрд╛рдиреВрди рдиреАрдЪреЗ рд╕реВрдЪреАрдмрджреНрдз рд╣реИрдВ:



рд╣рдо рдЙрди рдкрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХрдИ рдкреГрд╖реНрда рд▓реЗрдЧрд╛ рдФрд░ рдХреБрдЫ рдЙрдмрд╛рдК рд╣реЛрдЧрд╛ред рдпрджрд┐ рдЖрдк рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рдЬрд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд╡реЗ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

рдПрдкреЗрдХреНрдЯрд┐рд╡ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рдлрд╝рдВрдХреНрд╢рдВрд╕



Control.ApplicativeрдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ liftA2рдФрд░ рдирд┐рдореНрди рдкреНрд░рдХрд╛рд░ рд╣реИ:

 liftA2 :: (Applicative f) => (a -> b -> c) -> fa -> fb -> fc 


рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

 liftA2 :: (Applicative f) => (a -> b -> c) -> fa -> fb -> fc liftA2 fab = f <$> a <*> b 


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

рд╕рд╛рдзрд╛рд░рдг рдлрдВрдХреНрд╢рдирд▓рд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рд╣рдо рдХреЗрд╡рд▓ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╣реА рдлрд╝рдирдХрд╛рд░ рдореВрд▓реНрдп рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрд╡реЗрджрдХ рдлрдВрдХреНрд╢рдирд▓рд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рд╣рдо рдлрдВрдХреНрд╢рдВрд╕ рдХреЗ рдХрдИ рдорд╛рдиреЛрдВ рдХреЗ рдмреАрдЪ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдлрд╛рд░реНрдо рдореЗрдВ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рд╕рдордЭрдирд╛ рднреА рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ (a -> b -> c) -> (fa -> fb -> fc)ред рдЬрдм рд╣рдо рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдорд╣рд╕реВрд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ liftA2рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдмрд╛рдЗрдирд░реА рдлрд╝рдВрдХреНрд╢рди рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рддрд╛ рд╣реИ рдЬреЛ рджреЛ рдПрдкреЗрдЯрд┐рдЯрд┐рд╡ рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдЕрд╡рдзрд╛рд░рдгрд╛ рд╣реИ: рд╣рдо рджреЛ рдЖрд╡реЗрджрди рдореВрд▓реНрдпреЛрдВ рдХреЛ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдПрдХ рдЖрд╡реЗрджрдХ рдореВрд▓реНрдп рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рд╕реВрдЪреА рдореЗрдВ рдЗрди рджреЛ рдЖрд╡реЗрджрдХ рдореВрд▓реНрдпреЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдо рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣реИ Just 3рдФрд░ Just 4ред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рджреВрд╕рд░реЗ рдлрд╝рдирдХрд╛рд░ рдореЗрдВ рдПрдХ рдПрдХрд▓ рд╕реВрдЪреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ:

 ghci> fmap (\x -> [x]) (Just 4) Just [4] 


рдЦреИрд░, рд╣рдо рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣реИ Just 3рдФрд░ Just [4]ред рд╣рдо рдЗрд╕реЗ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ Just [3,4]? рдпрд╣ рд╕рд░рд▓ рд╣реИ:

 ghci> liftA2 (:) (Just 3) (Just [4]) Just [3,4] ghci> (:) <$> Just 3 <*> Just [4] Just [3,4] 


рд╕реНрдорд░рдг рдХрд░реЛ рдХрд┐ :рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдПрдХ рддрддреНрд╡ рдФрд░ рдПрдХ рд╕реВрдЪреА рд▓реЗрддрд╛ рд╣реИ рдФрд░ рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЙрд╕ рддрддреНрд╡ рдХреЗ рд╕рд╛рде рдПрдХ рдирдИ рд╕реВрдЪреА рджреЗрддрд╛ рд╣реИред рдЕрдм рдЬрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдпрд╣ рд╣реИ Just [3,4], рддреЛ рдХреНрдпрд╛ рд╣рдо рдЗрд╕реЗ Just 2рдЙрддреНрдкрд╛рджрди рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ Just [2,3,4]? рд╣рд╛рдБ, рд╡реЗ рдХрд░ рд╕рдХрддреЗ рдереЗред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдХрд┐рд╕реА рднреА рдЖрд╡реЗрджрдХ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдПрдХ рдЖрд╡реЗрджрдХ рдореВрд▓реНрдп рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдЗрди рдЖрд╡реЗрджрдХ рдореВрд▓реНрдпреЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИред

рдЖрдЗрдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ рдЬреЛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдорд╛рдиреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдПрдХ рдЖрд╡реЗрджрдХ рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕реВрдЪреА рдЗрд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдореВрд▓реНрдп рдХреЗ рд░реВрдк рдореЗрдВ рд╣реЛрддреА рд╣реИред рд╣рдо рдЙрд╕реЗ рдлреЛрди рдХрд░реЗрдВрдЧреЗ sequenceA:

 sequenceA :: (Applicative f) => [fa] -> f [a] sequenceA [] = pure [] sequenceA (x:xs) = (:) <$> x <*> sequenceA xs 


рдЖрд╣, рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐! рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдкреНрд░рдХрд╛рд░ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВред рдпрд╣ рдПрдХ рд╕реВрдЪреА рдХреЗ рд╕рд╛рде рдПрдХ рдЖрд╡реЗрджрдХ рдореВрд▓реНрдп рдореЗрдВ рдЖрд╡реЗрджрдХ рдореВрд▓реНрдпреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдХреЛ рдмрджрд▓ рджреЗрддрд╛ рд╣реИред рдЙрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рдЖрдзрд╛рд░ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдиреАрдВрд╡ рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рд╣рдо рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рд╕реВрдЪреА рдХреЗ рд╕рд╛рде рдПрдХ рдЦрд╛рд▓реА рд╕реВрдЪреА рдХреЛ рдПрдХ рдЖрд╡реЗрджрдХ рдореВрд▓реНрдп рдореЗрдВ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдХреЗрд╡рд▓ рдЦрд╛рд▓реА рд╕реВрдЪреА рдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕рдВрджрд░реНрдн рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВред рдЕрдм рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдЦреЗрд▓рдиреЗ рдореЗрдВ рдЖрддрд╛ рд╣реИред рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╕рд┐рд░ рдФрд░ рдПрдХ рдкреВрдВрдЫ рдХреЗ рд╕рд╛рде рдПрдХ рд╕реВрдЪреА рд╣реИ (рдпрд╛рдж рд░рдЦреЗрдВ, xрдпрд╣ рдПрдХ рдЖрд╡реЗрджрди рдореВрд▓реНрдп рд╣реИ, рдФрд░ xsрдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рд╕реВрдЪреА рд╣реИ), рд╣рдо sequenceAрдПрдХ рдкреВрдВрдЫ рдХреЗ рд╕рд╛рде рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдЗрд╕рдХреЗ рдЕрдВрджрд░ рдПрдХ рд╕реВрдЪреА рдХреЗ рд╕рд╛рде рдПрдХ рдЖрд╡реЗрджрдХ рдореВрд▓реНрдп рджреЗрддрд╛ рд╣реИред рдлрд┐рд░ рд╣рдо рдмрд╕ рдЖрд╡реЗрджрди рдореВрд▓реНрдп рдХреЗ рдЕрдВрджрд░ рдирд┐рд╣рд┐рдд рдореВрд▓реНрдп x, рдЗрд╕ рдЖрд╡реЗрджрдХ рдореВрд▓реНрдп рдХреЗ рдЕрдВрджрд░ рд╕реВрдЪреА, рдХрд┐ рдпрд╣ рд╣реИ рд╕реЗ рдкрд╣рд▓реЗ рд╣реИ!

рдорд╛рди рд▓реАрдЬрд┐рдП рд╣рдо рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ:

 sequenceA [Just 1, Just 2] 


рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ:

 (:) <$> Just 1 <*> sequenceA [Just 2] 


рдЗрд╕реЗ рдФрд░ рддреЛрдбрд╝рддреЗ рд╣реБрдП, рд╣рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ:

 (:) <$> Just 1 <*> ((:) <$> Just 2 <*> sequenceA []) 


рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдХреЙрд▓ sequenceA []рдлрд╝реЙрд░реНрдо рдореЗрдВ рд╕рдорд╛рдкреНрдд рд╣реЛрддреА рд╣реИ Just [], рдЗрд╕рд▓рд┐рдП рдпрд╣ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдЕрдм рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИ:

 (:) <$> Just 1 <*> ((:) <$> Just 2 <*> Just []) 


рдЬреЛ рдЗрд╕ рдХреЗ рд╕рдорд╛рди рд╣реИ:

 (:) <$> Just 1 <*> Just [2] 


рдХреНрдпрд╛ рдмрд░рд╛рдмрд░ рд╣реИ Just [1,2]!

рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдФрд░ рддрд░реАрдХрд╛ рд╣реИ, sequenceAрджреГрдврд╝ рд╕рдВрдХрд▓реНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рд▓рдЧрднрдЧ рдХреЛрдИ рднреА рдлрд╝рдВрдХреНрд╢рди рдЬрд╣рд╛рдВ рд╣рдо рддрддреНрд╡ рджреНрд╡рд╛рд░рд╛ рд╕реВрдЪреА рддрддреНрд╡ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХреЛ рд╕рдВрдЪрдп рдХреЗ рд╕рд╛рде рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

 sequenceA :: (Applicative f) => [fa] -> f [a] sequenceA = foldr (liftA2 (:)) (pure []) 


рд╣рдо рдмреИрдЯрд░реА рдХреЗ рдореВрд▓реНрдп рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реБрдП рдЕрдВрдд рд╕реЗ рд╕реВрдЪреА рд╕реЗ рдЧреБрдЬрд░рддреЗ рд╣реИрдВ pure []ред рд╣рдо liftA2 (:)рдмреИрдЯрд░реА рдФрд░ рд╕реВрдЪреА рдХреЗ рдЕрдВрддрд┐рдо рддрддреНрд╡ рдХреЗ рдмреАрдЪ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ , рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдПрдХ рдПрдХрд▓ рд╕реВрдЪреА рдХреЗ рд╕рд╛рде рдПрдХ рдЖрд╡реЗрджрдХ рдореВрд▓реНрдп рд╣реЛрддрд╛ рд╣реИред рддрдм рд╣рдо liftA2 (:)рд╡рд░реНрддрдорд╛рди рдЕрдВрддрд┐рдо рддрддреНрд╡ рдФрд░ рд╡рд░реНрддрдорд╛рди рдмреИрдЯрд░реА рдЖрджрд┐ рдХреЗ рд╕рд╛рде рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рдЬрдм рддрдХ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рдмреИрдЯрд░реА рд╣реА рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕рднреА рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореВрд▓реНрдпреЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реЛрддреА рд╣реИред

рдЖрдЗрдП рд╣рдорд╛рд░реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреБрдЫ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдорд╛рдиреЛрдВ рдкрд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ:

 ghci> sequenceA [Just 3, Just 2, Just 1] Just [3,2,1] ghci> sequenceA [Just 3, Nothing, Just 1] Nothing ghci> sequenceA [(+3),(+2),(+1)] 3 [6,5,4] ghci> sequenceA [[1,2,3],[4,5,6]] [[1,4],[1,5],[1,6],[2,4],[2,5],[2,6],[3,4],[3,5],[3,6]] ghci> sequenceA [[1,2,3],[4,5,6],[3,4,4],[]] [] 


рдЬрдм рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ Maybe, рддреЛ sequenceAрдПрдХ рдореВрд▓реНрдп рдмрдирд╛рддрд╛ Maybeрд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд╕реВрдЪреА рдореЗрдВ рд╕рднреА рдкрд░рд┐рдгрд╛рдо рд╣реЛрддреЗ рд╣реИрдВред рдпрджрд┐ рдореВрд▓реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╕рдорд╛рди рд╣реИ Nothing, рддреЛ рдкрд░рд┐рдгрд╛рдо рднреА рд╣реИ Nothingред рдпрд╣ рддрдм рд╢рд╛рдВрдд рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рдореВрд▓реНрдпреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реЛрддреА рд╣реИ MaybeрдФрд░ рдЖрдк рдХреЗрд╡рд▓ рдЙрди рдореВрд▓реНрдпреЛрдВ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ рдЬрдм рдЙрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рд╕рдорд╛рди рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ Nothingред

рдЬрдм рдлрд╝рдВрдХреНрд╢рди рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдХреА sequenceAрд╕реВрдЪреА рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рджреЗрддрд╛ рд╣реИ рдЬреЛ рдПрдХ рд╕реВрдЪреА рджреЗрддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдордиреЗ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдпрд╛ рдЬреЛ рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рд╕реВрдЪреА рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдлрд╝рдВрдХреНрд╢рди рдкрд░ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рд╕реВрдЪреА рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде sequenceA [(+3),(+2),(+1)] 3рдХреЙрд▓ рдХрд░реЗрдЧрд╛ , - рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде , рдФрд░ - рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде(+3)3(+2)3(+1)3, рдФрд░ рдЗрди рд╕рднреА рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдПрдХ рд╕реВрдЪреА рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдЧрд╛ред

рдирд┐рд╖реНрдкрд╛рджрди (+) <$> (+3) <*> (*2)рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдПрдЧрд╛ рдЬреЛ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рд▓реЗрддрд╛ рд╣реИ, рдЗрд╕реЗ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИ (+3)рдФрд░ (*2), рдФрд░ рдлрд┐рд░ +рдЗрди рджреЛ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ ред рдПрдХ рд╣реА рдирд╕ рдореЗрдВ, рдпрд╣ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ sequenceA [(+3),(*2)]рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рд╕реВрдЪреА рдореЗрдВ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИред +рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп , рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЗрди рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдЬрдорд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдпреЛрдЬрди рдХрд╛ :рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ pure []рд╣реИ рдЬреЛ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИред

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

 ghci> map (\f -> f 7) [(>4),(<10),odd] [True,True,True] ghci> and $ map (\f -> f 7) [(>4),(<10),odd] True 


рд╕реНрдорд░рдг рдХрд░реЛ рдХрд┐ рдкреНрд░рдХрд╛рд░ BoolрдФрд░ рдорд╛рдиреЛрдВ рдХреА рд╕реВрдЪреА рд▓реЗрддрд╛ рд╣реИ рдФрд░ Trueрдпрджрд┐ рд╡реЗ рд╕рднреА рд╕рдорд╛рди рд╣реИрдВ рддреЛ рд▓реМрдЯрддреЗ рд╣реИрдВ Trueред рдЙрд╕реА рдкрд░рд┐рдгрд╛рдо рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рджреВрд╕рд░рд╛ рддрд░реАрдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ sequenceA:

 ghci> sequenceA [(>4),(<10),odd] 7 [True,True,True] ghci> and $ sequenceA [(>4),(<10),odd] 7 True 


рдЕрдиреБрдХреНрд░рдо [(> рек), (<резреж), рд╡рд┐рд╖рдо] рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ рдПрдХ рд╕рдВрдЦреНрдпрд╛ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рд╕рднреА рд╡рд┐рдзреЗрдпрдХреЛрдВ рдореЗрдВ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИ [(>4),(<10),odd], рдФрд░ рдмреВрд▓рд┐рдпрди рдорд╛рдиреЛрдВ рдХреА рд╕реВрдЪреА рд▓реМрдЯрд╛рддрд╛ рд╣реИред рд╡рд╣ рдкреНрд░рдХрд╛рд░ рдХреА рдПрдХ рд╕реВрдЪреА рдмрдирд╛рддрд╛ рд╣реИ (Num a) => [a -> Bool]рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рд╕рдорд╛рд░реЛрд╣ рдореЗрдВ (Num a) => a -> [Bool]ред рдмрд╣реБрдд рд╢рд╛рдВрдд, рд╕рд╣реА?

рдЪреВрдВрдХрд┐ рд╕реВрдЪрд┐рдпрд╛рдВ рд╕рдЬрд╛рддреАрдп рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╕реВрдЪреА рдореЗрдВ рд╕рднреА рдХрд╛рд░реНрдп рд╕рдорд╛рди рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред рдЖрдкрдХреЛ рдПрдХ рд╕реВрдЪреА рдирд╣реАрдВ рдорд┐рд▓ рд╕рдХрддреА рд╣реИ [ord, (+3)], рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ ordрдПрдХ рдЪрд░рд┐рддреНрд░ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдПрдХ рдирдВрдмрд░ рджреЗрддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдпрд╣ (+3)рдПрдХ рдирдВрдмрд░ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдПрдХ рдирдВрдмрд░ рджреЗрддрд╛ рд╣реИред

рдЬрдм рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ [], рддреЛ sequenceAрд╕реВрдЪрд┐рдпреЛрдВ рдХреА рд╕реВрдЪреА рд▓реЗрддрд╛ рд╣реИ рдФрд░ рд╕реВрдЪрд┐рдпреЛрдВ рдХреА рд╕реВрдЪреА рд▓реМрдЯрд╛рддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдЙрди рд╕реВрдЪрд┐рдпреЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддрд╛ рд╣реИ рдЬрд┐рдирдореЗрдВ рдЙрди рддрддреНрд╡реЛрдВ рдХреЗ рд╕рднреА рд╕рдВрдпреЛрдЬрди рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рдЙрдирдореЗрдВ рд╣реИрдВред рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдБ рдПрдХ рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИsequenceAрдФрд░ рдлрд┐рд░ рдПрдХ рд╕реВрдЪреА рдЬрдирд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛:

 ghci> sequenceA [[1,2,3],[4,5,6]] [[1,4],[1,5],[1,6],[2,4],[2,5],[2,6],[3,4],[3,5],[3,6]] ghci> [[x,y] | x <- [1,2,3], y <- [4,5,6]] [[1,4],[1,5],[1,6],[2,4],[2,5],[2,6],[3,4],[3,5],[3,6]] ghci> sequenceA [[1,2],[3,4]] [[1,3],[1,4],[2,3],[2,4]] ghci> [[x,y] | x <- [1,2], y <- [3,4]] [[1,3],[1,4],[2,3],[2,4]] ghci> sequenceA [[1,2],[3,4],[5,6]] [[1,3,5],[1,3,6],[1,4,5],[1,4,6],[2,3,5],[2,3,6],[2,4,5],[2,4,6]] ghci> [[x,y,z] | x <- [1,2], y <- [3,4], z <- [5,6]] [[1,3,5],[1,3,6],[1,4,5],[1,4,6],[2,3,5],[2,3,6],[2,4,5],[2,4,6]] 


(+) <$> [1,2] <*> [4,5,6]рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЧреИрд░-рдирд┐рдпрддрд╛рддреНрдордХ рдЧрдгрдирд╛ рджреЗрддрд╛ рд╣реИ x + y, рдЬрд╣рд╛рдВ рдпрд╣ xрдкреНрд░рддреНрдпреЗрдХ рдореВрд▓реНрдп рд╕реЗ рд▓реЗрддрд╛ рд╣реИ [1,2]рдФрд░ yрдкреНрд░рддреНрдпреЗрдХ рдореВрд▓реНрдп рд╕реЗ рд▓реЗрддрд╛ рд╣реИ [4,5,6]ред рд╣рдо рдЗрд╕реЗ рдПрдХ рд╕реВрдЪреА рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдкрд░рд┐рдгрд╛рдо рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдЗрд╕реА рддрд░рд╣, рдЬрдм рд╣рдо рдкреНрд░рджрд░реНрд╢рди рдХрд░рддреЗ рд╣реИрдВ sequenceA [[1,2],[3,4],[5,6]], рддреЛ рдкрд░рд┐рдгрд╛рдо рдПрдХ рдЧреИрд░-рдирд┐рдпрддрд╛рддреНрдордХ рдЧрдгрдирд╛ рд╣реИ [x,y,z], рдЬрд╣рд╛рдВ рдпрд╣ xрдкреНрд░рддреНрдпреЗрдХ рдореВрд▓реНрдп рд╕реЗ рд▓реЗрддрд╛ рд╣реИ [1,2]рдФрд░ yрдкреНрд░рддреНрдпреЗрдХ рдореВрд▓реНрдп рд▓реЗрддрд╛ рд╣реИ [3,4], рдЖрджрд┐ред рдЗрд╕ рдЧреИрд░-рдирд┐рдпрддрд╛рддреНрдордХ рдЧрдгрдирд╛ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рд╕реВрдЪреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рд╕реВрдЪреА рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдЖрдЗрдЯрдо рдПрдХ рд╕рдВрднрд╡ рд╕реВрдЪреА рд╣реИред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдкрд░рд┐рдгрд╛рдо рд╕реВрдЪрд┐рдпреЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИред

рдЬрдм I / O рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ sequenceAрдпрд╣ рдЙрд╕реА рдХреЗ рд╕рдорд╛рди рд╣реЛрддрд╛ рд╣реИsequence! рдпрд╣ I / O рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдПрдХ I / O рдХреНрд░рд┐рдпрд╛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдЬреЛ рдЗрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреНрд░рд┐рдпрд╛ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдЧрд╛ рдФрд░ рдЗрди I / O рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдХреЗ рд░реВрдк рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдЧрд╛ред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХрд┐рд╕реА рдорд╛рди [IO a]рдХреЛ рдПрдХ рдорд╛рди рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ IO [a]рд▓рд┐рдП, I / O рдХреНрд░рд┐рдпрд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рджреЗрддрд╛ рд╣реИ, рдЗрди рд╕рднреА I / O рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдЕрдиреБрдХреНрд░рдо рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рд╡реЗ рдкрд░рд┐рдгрд╛рдо рдХреЗ рдмрд╛рдж рдПрдХ рдХреЗ рдмрд╛рдж рдПрдХ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛ рд╕рдХреЗрдВред ред рдмрд┐рдирд╛ рдХрд┐рдП рдЖрдк I / O рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред

рдЖрдЗрдП getLineрдПрдХ рдХреНрд░рдо рдореЗрдВ рддреАрди I / O рдХреНрд░рд┐рдпрд╛рдПрдВ рдХрд░реЗрдВ :

 ghci> sequenceA [getLine, getLine, getLine] heyh ho woo ["heyh","ho","woo"] 


рдирд┐рд╖реНрдХрд░реНрд╖ рдореЗрдВ, рдЖрд╡реЗрджрдХ рдлрдВрдХреНрд╢рдВрд╕ рди рдХреЗрд╡рд▓ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИрдВ, рдмрд▓реНрдХрд┐ рд╡реЗ рдЙрдкрдпреЛрдЧреА рднреА рд╣реИрдВред рд╡реЗ рд╣рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдВрдЧрдгрдирд╛рдУрдВ рдХреЛ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ - рдЬреИрд╕реЗ рдХрд┐ I / O рдЕрднрд┐рдХрд▓рди, рдЧреИрд░-рдирд┐рдпрддрд╛рддреНрдордХ рд╕рдВрдЧрдгрдирд╛рдПрдБ, рд╕рдВрдЧрдгрдирд╛рдПрдБ рдЬреЛ рд╡рд┐рдлрд▓ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ, рдФрд░ рдЗрд╕реА рддрд░рд╣ - рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╢реИрд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдПред рдмрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ <$>рдФрд░ <*>, рд╣рдо рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕реА рднреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдПрдкреНрд▓рд╛рд╕реНрдЯрд┐рдХ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рд╕рд╛рде рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рдХрд╛ рд▓рд╛рдн рдЙрдард╛ рд╕рдХрддреЗ рд╣реИрдВред


рдкреБрд╕реНрддрдХ рдХреЗ рдкрд┐рдЫрд▓реЗ рдЕрдзреНрдпрд╛рдпреЛрдВ рдХреЗ рдЕрдиреБрд╡рд╛рдж рдЬрд┐рдиреНрд╣реЗрдВ рдкреВрд░реНрдг рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг (рд╕рдВрд░рдЪрдирд╛ рдФрд░ рд╕рд╛рдордЧреНрд░реА) рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ:
  1. рдкрд░рд┐рдЪрдп
  2. рд╢реБрд░реБрдЖрдд
  3. рдкреНрд░рдХрд╛рд░ рдФрд░ рдкреНрд░рдХрд╛рд░ рдХрдХреНрд╖рд╛рдПрдВ
  4. рдлрд╝рдВрдХреНрд╢рди рд╕рд┐рдВрдЯреИрдХреНрд╕
  5. рдкреНрд░рддреНрдпрд╛рд╡рд░реНрддрди
  6. рдЙрдЪреНрдЪ рдЖрджреЗрд╢ рдХрд╛рд░реНрдп
  7. рдореЙрдбреНрдпреВрд▓
  8. рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рдФрд░ рдкреНрд░рдХрд╛рд░ рдХреА рдХрдХреНрд╖рд╛рдПрдВ рдмрдирд╛рдирд╛
  9. рдЗрдирдкреБрдЯ-рдЖрдЙрдЯрдкреБрдЯ
  10. рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди


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

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


All Articles