рд╣рд╛рд▓ рд╣реА рдореЗрдВ,
рдиреЛ рд╕реНрдЯрд╛рд░реНрдЪ рдкреНрд░реЗрд╕ рдиреЗ рдЧреНрд░реЗрдЯ рд▓реБрдХ рдХреЗ рд▓рд┐рдП рдЙрддреНрдХреГрд╖реНрдЯ
рд▓рд░реНрди рдпреВ рд╣рд╛рд╕реНрдХреЗрд▓ рдХреЗ рдПрдХ рдореБрджреНрд░рд┐рдд рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрддреНрдкрд╛рджрди рдФрд░
рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдпрд╛ рд╣реИ
! (рдСрдирд▓рд╛рдЗрди рд╕рдВрд╕реНрдХрд░рдг) рдореАрд░рд╛рди рд▓рд┐рдкреЛрд╡рд╛ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦрд┐рддред
рдореИрдВ рдЖрдкрдХреЛ рдЕрдзреНрдпрд╛рдп 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
рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╕рдордп рд▓реЗрдВ рдХрд┐ рдпрд╣ рдлрдВрдХреНрд╢рдВрд╕ рдХреЗ рдирд┐рдпрдореЛрдВ рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИред рдЖрдк рд╣рдореЗрд╢рд╛ рд▓рд╛рдЗрди рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд▓рд╛рдЗрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдХрд╛рдиреВрдиреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдпрд╛ рдПрдХ рдкреНрд░рддрд┐рд╕рд╛рдж рдЦреЛрдЬрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВред рдЬрдм рдЖрдк рдкрд░реНрдпрд╛рдкреНрдд рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рдирд▓рд░реНрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЙрдирдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рдЧреБрдг рдФрд░ рд╡реНрдпрд╡рд╣рд╛рд░ рд╕реАрдЦрдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрдВрдЧреЗ рдФрд░ рдпрд╣ рд╕рдордЭ рд╕рдХреЗрдВрдЧреЗ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдпрд╛ рд╡рд╣ рдкреНрд░рдХрд╛рд░ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рдирд┐рдпрдореЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддрд╛ рд╣реИредрдПрдкреНрд▓рд╛рдЗрдб рдлрдВрдХреНрд╢рдирд▓рд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛
рдЗрд╕ рд╕реЗрдХреНрд╢рди рдореЗрдВ, рд╣рдо рдЙрди рдПрдкреНрд▓рд╛рдЗрдб рдлрдВрдХреНрд╢рдирд▓рд░реНрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдПрдХреНрд╕рдЯреЗрдВрдбреЗрдб рдлрдВрдХреНрд╢рдирд▓рд░реНрд╕ рд╣реИрдВредрдЕрдм рддрдХ, рд╣рдордиреЗ рдХреЗрд╡рд▓ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рд▓реЗрдиреЗ рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ рдореИрдк рдХрд░рдиреЗ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд┐рдпрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ рдЬрдм рд╣рдо рдПрдХ рдлрдВрдХреНрд╢рдирд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рджреЛ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд▓реЗрдиреЗ рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ? рдЖрдЗрдП рдХреБрдЫ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ:рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╣реИ 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
рд╣рдордиреЗ рдлрд╝рдВрдХреНрд╢рди +
рдХреЛ рдПрдХ рдПрдкреЗрдЯрд┐рдЯрд┐рд╡ рдорд╛рди рдореЗрдВ рд▓рдкреЗрдЯрд╛ , рдФрд░ рдлрд┐рд░ <*>
рдЗрд╕реЗ рджреЛ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ , рдЬреЛ рджреЛрдиреЛрдВ рд╣реА рдРрдкреНрд▓рд┐рдХреЗрд╢рдВрд╕ рд╡реИрд▓реНрдпреВ рд╣реИрдВредрдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рд╣реЛрддрд╛ рд╣реИ, рдХрджрдо рд╕реЗ рдХрджрдоред <*>
рдмрд╛рдпрд╛рдВ-рд╕рд╣рдпреЛрдЧреА, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐: 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)
рдЪреВрдВрдХрд┐ рд╕рд╛рд░ pure
рдПрдХ рдиреНрдпреВрдирддрдо рд╕рдВрджрд░реНрдн рдореЗрдВ рдореВрд▓реНрдп рд░рдЦрдирд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЕрднреА рднреА рдореВрд▓реНрдп рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реИ рдХрд┐ pure
рдпрд╣ рд╕рд░рд▓ рд╣реИ return
ред return
I / 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]
рд╣рдо рдПрдХ рд╕рдорд╛рд░реЛрд╣ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдмрдирд╛рдиреЗ рдХреЗ \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
ред рдПрдХ рдЕрднреНрдпрд╛рд╕ рдХреЗ рд░реВрдк рдореЗрдВ, рдЖрдк рдЗрд╕ рдЕрдзреНрдпрд╛рдп рдореЗрдВ рдХреБрдЫ рдЖрд╡реЗрджрдХ рдлрдВрдХреНрд╢рдВрд╕ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдХрд╛рдиреВрди рдХреА рдкреВрд░реНрддрд┐ рд╕рд╛рдмрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдиреНрдп рдЖрд╡реЗрджрдХ рдХрд╛рдиреВрди рдиреАрдЪреЗ рд╕реВрдЪреАрдмрджреНрдз рд╣реИрдВ:pure id <*> v = v
pure (.) <*> u <*> v <*> w = u <*> (v <*> w)
pure f <*> pure x = pure (fx)
u <*> pure y = pure ($ y) <*> u
рд╣рдо рдЙрди рдкрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХрдИ рдкреГрд╖реНрда рд▓реЗрдЧрд╛ рдФрд░ рдХреБрдЫ рдЙрдмрд╛рдК рд╣реЛрдЧрд╛ред рдпрджрд┐ рдЖрдк рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рдЬрд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд╡реЗ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВредрдПрдкреЗрдХреНрдЯрд┐рд╡ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рдлрд╝рдВрдХреНрд╢рдВрд╕
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 рдЕрднрд┐рдХрд▓рди, рдЧреИрд░-рдирд┐рдпрддрд╛рддреНрдордХ рд╕рдВрдЧрдгрдирд╛рдПрдБ, рд╕рдВрдЧрдгрдирд╛рдПрдБ рдЬреЛ рд╡рд┐рдлрд▓ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ, рдФрд░ рдЗрд╕реА рддрд░рд╣ - рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╢реИрд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдПред рдмрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ <$>
рдФрд░ <*>
, рд╣рдо рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕реА рднреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдПрдкреНрд▓рд╛рд╕реНрдЯрд┐рдХ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рд╕рд╛рде рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд╢рдмреНрджрд╛рд░реНрде рдХрд╛ рд▓рд╛рдн рдЙрдард╛ рд╕рдХрддреЗ рд╣реИрдВред
рдкреБрд╕реНрддрдХ рдХреЗ рдкрд┐рдЫрд▓реЗ рдЕрдзреНрдпрд╛рдпреЛрдВ рдХреЗ рдЕрдиреБрд╡рд╛рдж рдЬрд┐рдиреНрд╣реЗрдВ рдкреВрд░реНрдг рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг (рд╕рдВрд░рдЪрдирд╛ рдФрд░ рд╕рд╛рдордЧреНрд░реА) рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ:- рдкрд░рд┐рдЪрдп
- рд╢реБрд░реБрдЖрдд
- рдкреНрд░рдХрд╛рд░ рдФрд░ рдкреНрд░рдХрд╛рд░ рдХрдХреНрд╖рд╛рдПрдВ
- рдлрд╝рдВрдХреНрд╢рди рд╕рд┐рдВрдЯреИрдХреНрд╕
- рдкреНрд░рддреНрдпрд╛рд╡рд░реНрддрди
- рдЙрдЪреНрдЪ рдЖрджреЗрд╢ рдХрд╛рд░реНрдп
- рдореЙрдбреНрдпреВрд▓
- рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рдФрд░ рдкреНрд░рдХрд╛рд░ рдХреА рдХрдХреНрд╖рд╛рдПрдВ рдмрдирд╛рдирд╛
- рдЗрдирдкреБрдЯ-рдЖрдЙрдЯрдкреБрдЯ
- рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди
рдкреНрд░рдХрд╛рд╢рди рдХреЗ рд▓рд┐рдП рдЕрдЧрд▓реА рдкрдВрдХреНрддрд┐ рдореЗрдВ рдореЛрдирд╛рдбреЛ рдХрд╛ рдЕрдзреНрдпрд╛рдп рд╣реИ ред рдЕрдм рддрдХ, рдореБрдЭреЗ рд╕рд╛рдордЧреНрд░реА рдореЗрдВ рд╕реБрдзрд╛рд░ рдХреЗ рд▓рд┐рдП рд░рдЪрдирд╛рддреНрдордХ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреА рдЙрдореНрдореАрдж рд╣реИред рдзрдиреНрдпрд╡рд╛рдж!