рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐
рдЗрд╕ рдЫреЛрдЯреЗ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рд╣рд╛рд╕реНрдХреЗрд▓ рдкреНрд░рдХрд╛рд░ рдкреНрд░рдгрд╛рд▓реА рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╢реНрд░реЗрдгреА рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ред рдХреЛрдИ рдЬрд╝рдореА, рдХреЛрдИ рдЪрд╛рд▓ рдирд╣реАрдВ - рдореИрдВ рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдордЭрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред рдореИрдВ рдПрдХ рдФрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рдПрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╛рдардХ рдХреА рдЬрд╛рдЧрд░реВрдХрддрд╛ рдХреЛ рднрдбрд╝рдХрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЧрдгрд┐рдд рдХреЗ рд╕рд╛рде рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдХрд╛ рдШрдирд┐рд╖реНрда рд╕рдВрдмрдВрдз рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
рдореИрдВ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдЕрдиреБрд╡рд╛рдж рдХреЛ рджреЛрд╣рд░рд╛рдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣реВрдВрдЧрд╛, рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣рдм рдкрд░ рдерд╛:
рд╢реНрд░реЗрдгреА рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдореЛрдирд╛рдбреНрд╕ , рд▓реЗрдХрд┐рди рд▓реЗрдЦ рдХреА рдЕрдЦрдВрдбрддрд╛ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЕрднреА рднреА рдореВрд▓ рдкрд░рд┐рднрд╛рд╖рд╛ рджреВрдВрдЧрд╛ред рдЙрд╕реА рд╕рдордп, рдЙрд╕ рд▓реЗрдЦ рдХреЗ рд╡рд┐рдкрд░реАрдд, рдореИрдВ рдЧрдгрд┐рдд рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
рдпрд╣ рд▓реЗрдЦ рдореЛрдЯреЗ рддреМрд░ рдкрд░ рдЕрдВрдЧреНрд░реЗрдЬреА
рд╣рд╕реНрдХреЗрд▓ рд╡рд┐рдХреАрдмреВрдХ рд╕реЗ рдПрдХ рдЦрдВрдб (рдЙрдзрд╛рд░ рдЪрд┐рддреНрд░ рд╕рд╣рд┐рдд) рджреЛрд╣рд░рд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдЗрд╕рдХрд╛ рд╕реАрдзрд╛ рдЕрдиреБрд╡рд╛рдж рдирд╣реАрдВ рд╣реИред
рд╢реНрд░реЗрдгреА рдХреНрдпрд╛ рд╣реИ?
рдЙрджрд╛рд╣рд░рдг
рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП, рд╣рдо рдкрд╣рд▓реЗ рд╕рд░рд▓ рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдХреЛ рджрд░реНрд╢рд╛рдиреЗ рд╡рд╛рд▓реЗ рдЪрд┐рддреНрд░реЛрдВ рдХреЗ рдПрдХ рдЬреЛрдбрд╝реЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред рдЙрдирдХреЗ рдкрд╛рд╕ рд▓рд╛рд▓ рд╡реГрддреНрдд рдФрд░ рддреАрд░ рд╣реИрдВ:
рд▓рд╛рд▓ рд╡реГрддреНрдд "рд╡рд╕реНрддреБрдУрдВ" рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рддреАрд░ "рдЖрдХрд╛рд░рд┐рдХреА" рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреЗ рд╣реИрдВред
рдореИрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЬреАрд╡рди рд╕реЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЬреЛ рд╡рд╕реНрддреБрдУрдВ рдФрд░ рдЖрдХрд╛рд░ рдХреА рдкреНрд░рдХреГрддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╕рд╣рдЬ рд╡рд┐рдЪрд╛рд░ рджреЗрдЧрд╛:
рд╢рд╣рд░реЛрдВ рдХреЛ "рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕" рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рд╢рд╣рд░реЛрдВ рдХреЗ рдмреАрдЪ рдЖрдВрджреЛрд▓рдиреЛрдВ - "рдЖрдХрд╛рд░рд┐рдХреА"ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдЙрдбрд╝рд╛рдиреЛрдВ рдХреЗ рдорд╛рдирдЪрд┐рддреНрд░ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдХрд┐рд╕реА рддрд░рд╣ рдореБрдЭреЗ рдЕрдЪреНрдЫреА рддрд╕реНрд╡реАрд░ рдирд╣реАрдВ рдорд┐рд▓реА) рдпрд╛ рд░реЗрд▓рд╡реЗ рдХрд╛ рдирдХреНрд╢рд╛ - рд╡реЗ рдКрдкрд░ рдХреА рддрд╕реНрд╡реАрд░реЛрдВ рдХреА рддрд░рд╣ рджрд┐рдЦреЗрдВрдЧреЗ, рдХреЗрд╡рд▓ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ред рдЖрдкрдХреЛ рдЙрди рджреЛ рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рдореЗрдВ рджреА рдЧрдИ рдкреНрд░рддреАрдд рд╣реЛрддреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рднрд╡рд┐рд╖реНрдп рдХреЗ рд▓рд┐рдП рд╡реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВ:
- рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдПрдХ рд╢рд╣рд░ рд╕реЗ рджреВрд╕рд░реЗ рд╢рд╣рд░ рддрдХ рдЯреНрд░реЗрди рдпрд╛ рд╡рд┐рдорд╛рди рд╕реЗ рдирд╣реАрдВ рдкрд╣реБрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ - рдЗрди рд╢рд╣рд░реЛрдВ рдХреЗ рдмреАрдЪ рдХреЛрдИ рдЖрдХрд╛рд░ рдирд╣реАрдВ рд╣реИрдВред
- рдЕрдЧрд░ рд╣рдо рдПрдХ рд╣реА рд╢рд╣рд░ рдХреЗ рднреАрддрд░ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рднреА рдПрдХ рд░реВрдкрд╡рд╛рдж рд╣реИ - рд╣рдо рд╢рд╣рд░ рд╕реЗ рдЙрд╕ рддрдХ рдХреА рдпрд╛рддреНрд░рд╛ рдХрд░рддреЗ рд╣реИрдВред
- рдпрджрд┐ рд╕реЗрдВрдЯ рдкреАрдЯрд░реНрд╕рдмрд░реНрдЧ рд╕реЗ рдорд╛рд╕реНрдХреЛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЯреНрд░реЗрди рд╣реИ, рдФрд░ рдорд╛рд╕реНрдХреЛ рд╕реЗ рдПрдореНрд╕реНрдЯрд░реНрдбрдо рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдбрд╝рд╛рди рд╣реИ, рддреЛ рд╣рдо рдПрдХ рдЯреНрд░реЗрди рдЯрд┐рдХрдЯ рдФрд░ рдПрдХ рд╣рд╡рд╛рдИ рдЬрд╣рд╛рдЬ рдХрд╛ рдЯрд┐рдХрдЯ рдЦрд░реАрдж рд╕рдХрддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ "рдЧрдардмрдВрдзрди" рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕ рддрд░рд╣ рд╕реЗрдВрдЯ рдкреАрдЯрд░реНрд╕рдмрд░реНрдЧ рд╕реЗ рдПрдореНрд╕реНрдЯрд░реНрдбрдо рддрдХ рдкрд╣реБрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ - рдЕрд░реНрдерд╛рдд, рдЖрдк рд╣рдорд╛рд░реЗ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдорд╛рдирдЪрд┐рддреНрд░ рдкрд░, рд╕реЗрдВрдЯ рдкреАрдЯрд░реНрд╕рдмрд░реНрдЧ рд╕реЗ рдПрдореНрд╕рдЯрд░реНрдбрдо рддрдХ рдЗрд╕ рд╕рдВрдпреБрдХреНрдд рдЖрдХрд╛рд░рд┐рдХреА рдХрд╛ рдЪрд┐рддреНрд░рдг рдХрд░рддреЗ рд╣реБрдП рдПрдХ рддреАрд░ рдЦреАрдВрдЪреЗрдВред
рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реИред рдФрд░ рдЕрдм рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝реА рдФрдкрдЪрд╛рд░рд┐рдХрддрд╛ред
рдкрд░рд┐рднрд╛рд╖рд╛
рддреЛ, рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рд╢реНрд░реЗрдгреА рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдФрд░ рдЖрдХрд╛рд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
- рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдПрдХ рд╡рд░реНрдЧ (рд╕реЗрдЯ) рд╣реИ ред рд╡рд╕реНрддреБрдПрдВ рдХрд┐рд╕реА рднреА рдЗрдХрд╛рдИ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред
- рдХрд┐рд╕реА рднреА рджреЛ рд╡рд╕реНрддреБрдУрдВ
A
рдФрд░ B
, рдЖрдХреГрддрд┐ рд╡рд┐рдЬреНрдЮрд╛рди Hom(A,B)
рдХреЗ рд╡рд░реНрдЧ Hom(A,B)
рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕ рд╡рд░реНрдЧ рд╕реЗ рдПрдХ рдЖрдХрд╛рд░рд┐рдХреА f
рд▓рд┐рдП, рд╡рд╕реНрддреБ A
рдХреЛ рдПрдХ рдХреНрд╖реЗрддреНрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ B
рдХреЛ рд╕рд╣ - рдХреНрд╖реЗрддреНрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ ред рдпрд╣ рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦрд╛ рд╣реИ:
f тИИ Hom(A,B)
рдпрд╛ f : A тЖТ B
- рдХрд┐рд╕реА рднреА рджреЛ рд░реВрдкрдХреЛрдВ рдХреЗ рд▓рд┐рдП
f : A тЖТ B
рдФрд░ g : B тЖТ C
, рдЙрдирдХреА рд░рдЪрдирд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ - рд░реВрдкрд╡рд╛рдж h = g тИШ f
, рдореЗрдВ
h : A тЖТ C
рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдХреНрд╖реЗрддреНрд░ g
рдФрд░ рд╕рд╣ рдХреНрд╖реЗрддреНрд░ f
рд╕рдВрдпреЛрдЧ рд╣реИред - рд░рдЪрдирд╛ рд╕рд╛рд╣рдЪрд░реНрдп рд╣реИ , рдЬреЛ рдХрд┐ рдХрд┐рд╕реА рднреА рдЖрдХрд╛рд░рд┐рдХреА
f : A тЖТ B
, g : B тЖТ C
рдФрд░ h : C тЖТ D
, рд╕рдорд╛рдирддрд╛
(h тИШ g) тИШ f = h тИШ (g тИШ f)
- рдХрд┐рд╕реА рднреА рд╡рд╕реНрддреБ
A
рдПрдХ "рдЗрдХрд╛рдИ" рдЖрдХрд╛рд░рд┐рдХреА рд╣реИ, рдЬрд┐рд╕реЗ id
A
: A тЖТ A
рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реВрдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдпрд╣ рд░рдЪрдирд╛ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рддрдЯрд╕реНрде рд╣реИ, рдЕрд░реНрдерд╛рдд, рдХрд┐рд╕реА рднреА рд░реВрдкрд╡рд╛рдж рдХреЗ рд▓рд┐рдП f : A тЖТ B
, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд░рдЦрддреА рд╣реИ:
id
B
тИШ f = f = f тИШ id
A
рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рд╕реВрдЪрдХрд╛рдВрдХ рдореБрдЭреЗ рдкрд░реЗрд╢рд╛рди рдХрд░реЗрдЧрд╛ рдФрд░ рдореИрдВ рд╕рд┐рд░реНрдл
id
рд▓рд┐рдЦреВрдВрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛ рдХреНрд╖реЗрддреНрд░ / рд╕рд╣-рдХреНрд╖реЗрддреНрд░ рд╕рдВрджрд░реНрдн рд╕реЗ рдмрд╣рд╛рд▓ рд╣реИред
рдпрд╣ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рднреА рдЧреБрдг рд╕рдВрддреБрд╖реНрдЯ рд╣реИрдВ: рд░рдЪрдирд╛, рдЬрдм рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рд╕рд╣рдпреЛрдЧреА рд╣реИ рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рдЗрдХрд╛рдИ рдЖрдХрд╛рд░ рдЗрд╕рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рддрдЯрд╕реНрде рд╣реИрдВред рд╢рд╣рд░реЛрдВ рдХреЗ рдмреАрдЪ рдмрдврд╝рдиреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдПрдХрдорд╛рддреНрд░ рд╕рдорд╕реНрдпрд╛ рд╕рдорд░реВрдкрддрд╛ рдХреЗ рд╕рд╛рде рдкреИрджрд╛ рд╣реЛрддреА рд╣реИ - рдпрд╣рд╛рдВ рдЖрдкрдХреЛ "рдЯрд┐рдХрдЯреЛрдВ рдХреЗ рд╕рдВрдпреЛрдЬрди" рдХреЗ рд░реВрдк рдореЗрдВ рд░рдЪрдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рди рдХрд┐ рдХрд┐рд╕реА рд╡реНрдпрдХреНрддрд┐ рд╡рд┐рд╢реЗрд╖ рдХреЗ рдЕрдиреБрдХреНрд░рдорд┐рдХ рдЖрдВрджреЛрд▓рдиреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВред
рд╕реЗрд▓реНрдл рдПрдХреНрд╕рд░рд╕рд╛рдЗрдЬ рдПрдХреНрд╕рд░рд╕рд╛рдЗрдЬ: рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЗрдореЗрдЬ рдПрдХ рд╢реНрд░реЗрдгреА рд╣реИ
рдореБрдЦреМрдЯрд╛ рд╢реНрд░реЗрдгреА
рдФрд░ рдЕрдм рдореБрдЦреНрдп рдЙрджрд╛рд╣рд░рдг, рд▓реЗрдЦ рдХрд╛ рдореБрдЦреНрдп рд╡рд┐рд╖рдпред
рд╣рд╕реНрдХ рд╢реНрд░реЗрдгреА рдореЗрдВ рд╣рд╛рд╕реНрдХреЗрд▓ рднрд╛рд╖рд╛ рдХреЗ рдкреНрд░рдХрд╛рд░ рдФрд░ рдЙрдирдХреЗ рдмреАрдЪ рдХреЗ рдХрд╛рд░реНрдп рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдЕрдзрд┐рдХ рд╕рдЦреНрддреА рд╕реЗ:
- рд╣рд╕реНрдХ рдСрдмреНрдЬреЗрдХреНрдЯ: 1
*
рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░: Integer
, Bool
, Char
, рдЖрджрд┐ред "рдЯрд╛рдЗрдк" Maybe
рдХрд┐ рдПрдХ рддрд░рд╣ рдХрд╛ * тЖТ *
, рд▓реЗрдХрд┐рди Maybe Bool
рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ *
рдФрд░ рдЗрд╕рд▓рд┐рдП рд╣рд╛рд╕реНрдХ рдореЗрдВ рдПрдХ рд╡рд╕реНрддреБ рд╣реЛред рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рд╕рдорд╛рди, рд▓реЗрдХрд┐рди рдмрд╛рдж рдореЗрдВ рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВред рдкрджрдирд╛рдо: a тИ╖ *
тЙб " a
рдкреНрд░рдХрд╛рд░ рд╣реИ *
" a
" a
рд╣реИрд╕реНрдХ рдореЗрдВ рдПрдХ рд╡рд╕реНрддреБ рд╣реИ"ред - рд╣рд╕реНрдХ рдореЙрд░реНрдлрд┐рдЬреНрдо : рдХреЛрдИ рднреА рд╣рд╛рд╕реНрдХреЗрд▓ рдПрдХ рд╡рд╕реНрддреБ рд╕реЗ рджреВрд╕рд░реЗ рдкреНрд░рдХрд╛рд░ (рдкреНрд░рдХрд╛рд░) рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред рдпрджрд┐
a, b тИ╖ *
, рддреЛ рдлрд╝рдВрдХреНрд╢рди f тИ╖ a тЖТ b
рдХреНрд╖реЗрддреНрд░ рдФрд░ рд╕рд╣-рдХреНрд╖реЗрддреНрд░ b
рд╕рд╛рде рдПрдХ рд░реВрдкрд╡рд╛рдж рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╡рд╕реНрддреБрдУрдВ a
рдФрд░ b
рдмреАрдЪ рдЖрдХрд╛рд░рд┐рдХреА рдХреЗ рд╡рд░реНрдЧ рдХреЛ a тЖТ b
рдкреНрд░рдХрд╛рд░ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЧрдгрд┐рддреАрдп рд╕рдВрдХреЗрддрди рдХреЗ рд╕рд╛рде рд╕рд╛рджреГрд╢реНрдп рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░реНрдпрд╛рдпрд╡рд╛рдЪреА рдХреЛ рджрд░реНрдЬ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
type Hom(a,b) = a тЖТ b
рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЬрд╛рд░реА рдирд╣реАрдВ рд░рдЦреВрдВрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рддреАрд░, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рд╕реНрдкрд╖реНрдЯ рд╣реИред - рд░рдЪрдирд╛: рдорд╛рдирдХ рдлрд╝рдВрдХреНрд╢рди
(.) тИ╖ (b тЖТ c) тЖТ (a тЖТ b) тЖТ (a тЖТ c)
ред рдХрд┐рд╕реА рднреА рджреЛ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП f тИ╖ a тЖТ b
рдФрд░ g тИ╖ b тЖТ c
рд░рдЪрдирд╛ g . f тИ╖ a тЖТ c
g . f тИ╖ a тЖТ c
рдХреЛ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
g . f = ╬╗x тЖТ g (fx)
- рдЗрд╕ рдкрд░рд┐рднрд╛рд╖рд╛ рд╕реЗ рд░рдЪрдирд╛ рдХреА рд╕рдВрдмрджреНрдзрддрд╛ рд╕реНрдкрд╖реНрдЯ рд╣реИ: рдХрд┐рд╕реА рднреА рддреАрди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП
f тИ╖ a тЖТ b
, g тИ╖ b тЖТ c
рдФрд░ h тИ╖ c тЖТ d
(h . g) . f тЙб h . (g . f) тЙб ╬╗x тЖТ h (g (fx))
рдкреНрд░рддреНрдпрдХреНрд╖ рдЬрд╛рдВрдЪ: (h . g) . f тЙб ╬╗x тЖТ (h . g) (fx) тЙб ╬╗x тЖТ (╬╗y тЖТ h (gy)) (fx) тЙб ╬╗x тЖТ h (g (fx)) h . (g . f) тЙб ╬╗x тЖТ h ((g . f) x) тЙб ╬╗x тЖТ h ((╬╗y тЖТ g (fy)) x) тЙб ╬╗x тЖТ h (g (fx))
- рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП
a тИ╖ *
рдлрдВрдХреНрд╢рди id тИ╖ a тЖТ a
рднреА рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИ:
id = ╬╗x тЖТ x
рдЗрд╕ рдкрд░рд┐рднрд╛рд╖рд╛ рд╕реЗ, рдЖрд╡рд╢реНрдпрдХ рдЧреБрдгреЛрдВ рдХреА рдкреВрд░реНрддрд┐ рд╕реНрдкрд╖реНрдЯ рд╣реИред рдЖрдЬреНрдЮрд╛ рджреЗрдирд╛ f тИ╖ a тЖТ b
f . id тЙб ╬╗x тЖТ f (id x) тЙб ╬╗x тЖТ fx тЙб f id . f тЙб ╬╗x тЖТ id (fx) тЙб ╬╗x тЖТ fx тЙб f
рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдкреЙрд▓рд┐рдореЙрд░реНрдлрд┐рдХ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕рднреА рдореЗрдВ рдПрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХрд▓ рдЖрдХрд╛рд░рд╡рд╛рдж рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рд╣рдо рдЗрд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рд░реВрдкрд╡рд╛рдж рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдиреБрднрд╡ рдХрд░реЗрдВрдЧреЗ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ
Char
рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдПрдХ рдореЛрдиреЛрдореЛрд░реНрдлрд┐рдХ рдлрд╝рдВрдХреНрд╢рди
id тИ╖ Char тЖТ Char
ред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдЗрдВрдбреЗрдХреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреА рдереА - рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ, рдЖрдкрдХреЛ рдкреНрд░рддреНрдпреЗрдХ
id
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕рдВрджрд░реНрдн рд╕реЗ рдЕрдиреБрдорд╛рдирд┐рдд рд╣реИред
рдЗрд╕рд▓рд┐рдП, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ, рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдЗрдХрд╛рдЗрдпрд╛рдВ рдореМрдЬреВрдж рд╣реИрдВ, рдЙрдирдХреЗ рд░рд┐рд╢реНрддреЗ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдП рдЧрдП рд╣реИрдВ рдФрд░ рдЖрд╡рд╢реНрдпрдХ рдЧреБрдг рдкреВрд░реЗ рдХрд┐рдП рдЧрдП рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП
рд╣рд╛рд╕реНрдХ рдПрдХ рдкреВрд░реНрдг рд╢реНрд░реЗрдгреА рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдХреИрд╕реЗ рд╕рднреА рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдФрд░ рдирд┐рд░реНрдорд╛рдгреЛрдВ рдХреЛ рдЧрдгрд┐рддреАрдп рд╕рдВрдХреЗрддрди рд╕реЗ рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рдиреНрдпреВрдирддрдо рд╡рд╛рдХреНрдпрд╛рддреНрдордХ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд╕рд╛рде рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЖрдЧреЗ рдореИрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ
рдмрддрд╛рдКрдВрдЧрд╛ рдХрд┐
рдлрдВрдХреНрд╢рдиреНрд╕ рдХреНрдпрд╛ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ
рд╣рд╛рд╕реНрдХ рд╢реНрд░реЗрдгреА рдореЗрдВ рдХреИрд╕реЗ рдореВрд░реНрдд рд░реВрдк рджрд┐рдпрд╛
рдЬрд╛рддрд╛ рд╣реИ ред
functors
рдлрдВрдбрд░реНрд╕ рдПрдХ рд╢реНрд░реЗрдгреА рд╕реЗ рджреВрд╕рд░реА рд╢реНрд░реЗрдгреА рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЪреВрдВрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╢реНрд░реЗрдгреА рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдФрд░ рдореЙрд░реНрдлрд┐рдЬреНрдо рд╣реЛрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдлрд╝рдирдХрд╛рд░ рдХреЛ рдореИрдкрд┐рдВрдЧ рдХреА рдПрдХ рдЬреЛрдбрд╝реА рднреА рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП: рдкрд╣рд▓реА рд╢реНрд░реЗрдгреА рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рджреВрд╕рд░реА рдореЗрдВ рдореИрдк рдХрд░реЗрдВрдЧреЗ, рдФрд░ рджреВрд╕рд░реЗ рдореЗрдВ рдореЙрд░реНрдлрд┐рдЬрд╝реНрдо рдХреЛ рдореИрдк рдХрд░реЗрдВрдЧреЗ - рджреВрд╕рд░реЗ рдореЗрдВ рдореЙрд░реНрдлрд┐рдЬрд╝реНрдоред
рдкрд╣рд▓реЗ рдореИрдВ рдПрдХ рдЧрдгрд┐рддреАрдп рдкрд░рд┐рднрд╛рд╖рд╛ рджреВрдВрдЧрд╛, рдФрд░ рдлрд┐рд░ рдореИрдВ рдпрд╣ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реВрдВрдЧрд╛ рдХрд┐ рд╣рд╛рд╕реНрдХреЗрд▓ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдХрд┐рддрдирд╛ рд╕рд░рд▓ рд╣реИред
рдЧрдгрд┐рддреАрдп рдкрд░рд┐рднрд╛рд╖рд╛
рджреЛ рд╢реНрд░реЗрдгрд┐рдпреЛрдВ
C
рдФрд░
D
рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдФрд░
C
рд╕реЗ
D
рддрдХ рдХреЗ рдлрдВрдХреНрдЯрд░
F
D
рд╕рдВрдХреЗрддрди рдХреЗ рд░реВрдк рдореЗрдВ рд╣реА рд╕рдВрдХреЗрддрди рд╣реИ, рдХреЗрд╡рд▓ рдлрд╝рдирдХрд╛рд░ рдХреЛ рдПрдХ рдмрдбрд╝реЗ рдЕрдХреНрд╖рд░ рджреНрд╡рд╛рд░рд╛ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
F : C тЖТ D
рдЗрд╕
F
рдХреА рджреЛ рднреВрдорд┐рдХрд╛рдПрдБ рд╣реИрдВ:
- рд╢реНрд░реЗрдгреА
C
рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдСрдмреНрдЬреЗрдХреНрдЯ A
рд╢реНрд░реЗрдгреА D
рд╕реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ рдФрд░ F(A)
рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реВрдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред - рдкреНрд░рддреНрдпреЗрдХ рдЖрдХрд╛рд░рд╡рд╛рдж
g : A тЖТ B
рд╢реНрд░реЗрдгреА C
рд╕реЗ g : A тЖТ B
, рд╢реНрд░реЗрдгреА D
рд╕реЗ рдЖрдХрд╛рд░рд┐рдХреА рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ рдФрд░ F(g) : F(A) тЖТ F(B)
рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реВрдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдПрдХ рдмрд╛рд░ рдлрд┐рд░, рдПрдХ рдлрдирдХрд╛рд░ рдордкрд┐рдВрдЧреНрд╕ рдХреА рдПрдХ рдЬреЛрдбрд╝реА рд╣реИ:
A тЖж F(A) g : A тЖТ B тЖж F(g) : F(A) тЖТ F(B)
рддрд╕реНрд╡реАрд░ рдореЗрдВ, рдкрд╣рд▓рд╛ рдкреНрд░рджрд░реНрд╢рди рдкреАрд▓реЗ рдзрд░рд╛рд╢рд╛рдпреА рддреАрд░ рдХреЗ рд╕рд╛рде рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ рдиреАрд▓реЗ рд░рдВрдЧ рдХреЗ рд╕рд╛рде:
рджреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреНрд░рд╛рдХреГрддрд┐рдХ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрдЯрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
- рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдПрдХрд▓ рдЖрдХрд╛рд░ рдХреЛ рдЕрдкрдиреА рдЫрд╡рд┐ рдХреЗ рдПрдХрд▓ рдЖрдХрд╛рд░рд╡рд╛рдж рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
F(id
A
) = id
F(A)
- рдЙрд╕реЗ рдЖрдХрд╛рд░ рдХреА рд░рдЪрдирд╛ рдХрд╛ рдЕрдкрдиреА рдЫрд╡рд┐рдпреЛрдВ рдХреА рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:
F(h тИШ g) = F(h) тИШ F(g)
рд╣рд╛рд╕реНрдХ рдореЗрдВ рдлрдВ
рдЕрдм рд╣рдо
Hask рд╢реНрд░реЗрдгреА рд╕реЗ
Hask рдХреЗ рдлрдВрдХреНрд╢рдирд▓рд░реНрд╕ рдХреЛ
рджреЗрдЦрддреЗ рд╣реИрдВ ред рд╡реИрд╕реЗ, рдРрд╕реЗ рдлрдВрдХреНрд╢рдирд▓рд░реНрд╕ рдЬреЛ рдХрд┐рд╕реА рд╢реНрд░реЗрдгреА рдХреЛ рд╕реНрд╡рдпрдВ рдореЗрдВ рдЕрдиреБрд╡рд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ
рдПрдВрдбреЛрдлреБрдиреНрдХреНрдЯрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рддреЛ, рдлрд┐рд░ рд╣рдореЗрдВ рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди - рджреЛ рдореИрдкрд┐рдВрдЧред рдФрд░ рд╣рд╛рд╕реНрдХреЗрд▓ рднрд╛рд╖рд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдкрд╣рд▓реЗ рдХрд┐рд╕ рд░реВрдк рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ? рдпрд╣ рд╕рд╣реА рд╣реИ, рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде
* тЖТ *
ред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╡рд░реНрдгрд┐рдд рдкреНрд░рдХрд╛рд░
Maybe тИ╖ * тЖТ *
ред рдпрд╣ рдПрдХ рдРрд╕рд╛ рдирдХреНрд╢рд╛ рд╣реИ рдЬреЛ рдХрд┐рд╕реА рднреА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдореИрдк рдХрд░рддрд╛
a тИ╖ *
рдПрдХ рд╣реА рд╢реНрд░реЗрдгреА рд╕реЗ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ
(Maybe a) тИ╖ *
ред
(Maybe a) тИ╖ *
ред рдпрд╣рд╛рдБ
Maybe a
рджрд┐рдП рдЧрдП рдкреИрд░рд╛рдореАрдЯрд░
a
рд╕рд╛рде рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдХ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рд╕рдордЭрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдЧрдгрд┐рддреАрдп рдкрд░рд┐рднрд╛рд╖рд╛ рд╕реЗ
F(A)
рд╕рдорд╛рди рдПрдХрд▓ рдЪрд░рд┐рддреНрд░ рдХреЗ рд░реВрдк рдореЗрдВред
рддреЛ, рдкрд╣рд▓реА рдореИрдкрд┐рдВрдЧ рд╣рдореЗрдВ рдореБрдлреНрдд рдореЗрдВ рджреА рдЧрдИ рд╣реИ - рдпрд╣ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИред
data Maybe a = Nothing | Just a
рд▓реЗрдХрд┐рди рджреВрд╕рд░реА рдореИрдкрд┐рдВрдЧ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ? рд╣рд╛рд╕реНрдХреЗрд▓ рдиреЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╡рд░реНрдЧ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛:
class Functor f where fmap тИ╖ (a тЖТ b) тЖТ (fa тЖТ fb)
рдЬрд╣рд╛рдВ
f тИ╖ * тЖТ *
ред рдпрд╣реА рд╣реИ,
fmap
рдПрдХ рдмрд╣реБрд░реВрдкреА рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рд░реВрдкрд╡рд╛рдж рдХреЛ
a тЖТ b
рд▓реЗрддрд╛ рд╣реИ рдФрд░ morphism
fa тЖТ fb
рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╣рдо
Maybe
рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдлрдВрдХреНрд╢рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдХреЗ
Maybe
рдЕрд╕рд▓реА рдлрд╝рдирдХрд╛рд░ рдмрдирд╛рдпреЗрдВрдЧреЗ:
instance Functor Maybe where fmap g = fg where fg Nothing = Nothing fg (Just x) = Just (gx)
рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ рджреЛ рдореИрдкрд┐рдВрдЧ рдорд┐рд▓реАрдВ:
a тИ╖ * тЖж Maybe a тИ╖ * g тИ╖ a тЖТ b тЖж fmap g тИ╖ Maybe a тЖТ Maybe b
рдХреБрдЫ рднреА рдирд╣реАрдВ, рдЧрдгрд┐рддреАрдп рд╕рдВрдХреЗрддрди рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЙрдирдХреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдирд╛рдо рд╣реИрдВ, рдмрд╕ рдЗрд╕ рддрд░рд╣ рдХреА рднрд╛рд╖рд╛ рдХреА рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдЕрд░реНрде рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
рдЦреИрд░, рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?
fmap
рдХреЛ
id
рдХреЛ рд╕рд╣реЗрдЬрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рд░рдЪрдирд╛ рдХреЛ рд░рдЪрдирд╛ рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:
fmap id тЙб id fmap (h . g) тЙб (fmap h) . (fmap g)
рдпрд╣ рдЬрд╛рдВрдЪрдирд╛ рдЖрд╕рд╛рди рд╣реИ, рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЙрдкрд░реНрдпреБрдХреНрдд рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ
Maybe
ред
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдо рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдмрд╕ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рдХреЗ рдкрд╣рд▓реА рдореИрдкрд┐рдВрдЧ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рдФрд░ рдЙрд╕рдХреЗ рд▓рд┐рдП, рдЬреИрд╕рд╛ рдХрд┐ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдмреАрдЪ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдорд╛рдпрдиреЗ рдирд╣реАрдВ рд░рдЦрддрд╛ рд╣реИ рдХрд┐
Maybe
рдкреНрд░рдХрд╛рд░ рдХреИрд╕реЗ
Maybe
: рдпрд╣ рдмрд╕
Maybe a
рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдореИрдк рдХрд░рддрд╛
Maybe a
, рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ред
рдЖрдХрд╛рд░рд┐рдХреА рдХреЗ рдорд╛рдирдЪрд┐рддреНрд░рдг рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рдм рдХреБрдЫ рдЗрддрдирд╛ рд╕рд░рд▓ рдирд╣реАрдВ рд╣реИ: рд╣рдореЗрдВ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ
fmap
рдирд┐рд░реНрдзрд╛рд░рд┐рдд
fmap
,
Maybe
рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдПред рдПрдХ рддрд░рдл, рдпрд╣ рд╣рдореЗрдВ рдХреБрдЫ рд▓рдЪреАрд▓рд╛рдкрди рджреЗрддрд╛ рд╣реИ - рд╣рдо рддрдп рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХреЛрдИ рднреА рдлрд╝рдВрдХреНрд╢рди рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдХреИрд╕реЗ рдмрджрд▓ рджреЗрдЧрд╛ред рд▓реЗрдХрд┐рди рджреВрд╕рд░реА рдУрд░, рдЗрд╕ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕реЗ рдкреНрд░рд╛рдХреГрддрд┐рдХ рддрд░реАрдХреЗ рд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП
data Foo a = Bar a Int [a] | Buz Char Bool | Qux (Maybe a)
рдлрд╝рдВрдХреНрд╢рди
g тИ╖ a тЖТ b
рдХреЛ рд╕рднреА рдбреЗрдЯрд╛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░реНрд╕ рдХреЛ рдкреБрди: рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░, рдЬрд╣рд╛рдБ рднреА рдЙрдирдХреЗ рдкрд╛рд╕ a рдХрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реЛ
a
рдЙрд╕реЗ
g
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░реЗрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдЧрд░
[a]
рдпрд╛
Maybe a
, рддреЛ рдЙрдирдХреЗ
fmap g
рдХреЛ рдЙрдирдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рдлрд┐рд░ рд╕реЗ рдЙрдирдХреЗ рдврд╛рдВрдЪреЗ рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░ рджреЗрдЧрд╛ рдФрд░ рдЙрд╕реЗ рдмрджрд▓ рджреЗрдЧрд╛ред
рдФрд░ рд▓реЛ рдФрд░ рдирд┐рд╣рд╛рд░рдирд╛, рдпрд╣ рд╕рдВрднрд╡ рд╣реИ! GHC рдХрд╛
рд╕рдВрдЧрдд рд╡рд┐рд╕реНрддрд╛рд░ рд╣реИ ред рд╣рдо рдХреЛрдб рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ:
{-# LANGUAGE DeriveFunctor #-} тАж data Foo a = тАж deriving Functor
рдФрд░ рд╣рдо рддреБрд░рдВрдд
рдЗрд╕реА рд╢реНрд░реЗрдгреА рдХреЗ рд╕рд╛рде
рд╣рд╛рд╕реНрдХ рд╢реНрд░реЗрдгреА -
Foo
рдХрд╛ рдкреВрд░реНрдг-
рд╕рдВрдкрдиреНрди рдПрдВрдбреЛрдлрдВрдХрд░ fmap
ред
рд╡реИрд╕реЗ, рдпрд╣ рдХрд╣рдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдпреЗ
рдлрд╝рдВрдХреНрд╢рдВрд╕ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ
рд╣рд╛рд╕реНрдХ рд╢реНрд░реЗрдгреА рдХреЛ рдЗрд╕рдХреЗ
рдЙрдкрд╢реНрд░реЗрдгреА рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ,
рдЕрд░реНрдерд╛рддреН, рд╢реНрд░реЗрдгреА рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдФрд░ рдЖрдХрд╛рд░ рдХреЗ рдЫреЛрдЯреЗ рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рдеред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
a тЖж Maybe a
рдХрд┐ рдореИрдкрд┐рдВрдЧ рдХрд░рдХреЗ
a тЖж Maybe a
рд╣рдо рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдкреНрд░рдХрд╛рд░
Int
рдирд╣реАрдВ рдкрд╛ рд╕рдХрддреЗ - рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рд╣рдо рдХреНрдпрд╛ рд▓реЗрддреЗ рд╣реИрдВред рдлрд┐рд░ рднреА, рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЙрдкрд╡рд░реНрдЧ рдФрд░ рдЙрди рдкрд░ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рд╡рд░реНрдЧ рднреА рд░реВрдк рдореЗрдВ рдПрдХ рд╢реНрд░реЗрдгреА рдмрдирд╛рддреЗ рд╣реИрдВред
рдлрд╝рдирдХрд╛рд░ рд╡рд░реНрдЧ рдХреЗ
рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдореЗрдВ, рдЖрдк рдЙрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рднреА рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдирдХреЗ рд▓рд┐рдП рдЕрд╡рддрд╛рд░ рдХреЛ рд╢реБрд░реВ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╡реЗ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдмрд╛рдж рдореЗрдВ рдХрд╣рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдкреНрд░рдХрд╛рд░ рдПрдХ рд╕рдиреНрдпрд╛рд╕реА рд╣реИред
рдирд┐рд╖реНрдХрд░реНрд╖
рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ
рд╣рд╕реНрдХ рд╢реНрд░реЗрдгреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдФрд░
рдЙрд╕рдореЗрдВ рдореМрдЬреВрдж
рдлрдВрдХреНрд╢рдирд▓рд░реНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХреА, рдФрд░ рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЗрд╕рд╕реЗ рд╣рд╛рд╕реНрдХреЗрд▓ рдкреНрд░рдХрд╛рд░ рдкреНрд░рдгрд╛рд▓реА рдХреЛ рдПрдХ рдирдП рдкрд░рд┐рдкреНрд░реЗрдХреНрд╖реНрдп рдореЗрдВ рд╕рдордЭрдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓реАред рд╢рд╛рдпрдж рдпрд╣ рдПрдХ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдмреЗрдХрд╛рд░ рд▓рдЧрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рд░ рдХреЛрдИ рд╢рд╛рдпрдж рдЕрдкрдиреЗ рддрд░реАрдХреЗ рд╕реЗ
fmap
рдХрд╛ рдЕрд░реНрде рд╕рдордЭрддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдЬрд╛рдиреЗ рдмрд┐рдирд╛ рдХрд┐ рдПрдХ
fmap
рдХреНрдпрд╛ рд╣реИред рд▓реЗрдХрд┐рди рддрдм рдореИрдВ
Hask рд╢реНрд░реЗрдгреА рдХреА
рдХреБрдВрдЬреА рдореЗрдВ рдкреНрд░рд╛рдХреГрддрд┐рдХ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ, рдордареЛрдВ рдФрд░ рдЕрдиреНрдп рд╢реНрд░реЗрдгреАрдмрджреНрдз рдирд┐рд░реНрдорд╛рдгреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдлрд┐рд░, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рдЧрдгрд┐рддреАрдп рдПрдирд╛рд▓реЙрдЧреНрд╕ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧреА рд╣реЛрдВрдЧреЗ, рдЬрд┐рд╕рд╕реЗ рдЖрдк рдЗрди рднрд╛рд╖рд╛ рдирд┐рд░реНрдорд╛рдгреЛрдВ рдХреА рдЖрдВрддрд░рд┐рдХ рдкреНрд░рдХреГрддрд┐ рдХреЛ рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рд╕рдордЭ рдкрд╛рдПрдВрдЧреЗ рдФрд░ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдФрд░ рдЕрдзрд┐рдХ рд╕рдЪреЗрдд рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд░ рдкрд╛рдПрдВрдЧреЗред
- рдпрджрд┐ рдХрд┐рд╕реА рдХреЛ рдкрд╣рд▓реЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИ, рддреЛ рдореИрдВ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рд╕рдордЭрд╛рддрд╛ рд╣реВрдВред рдХрд┐рдВрдбреНрд╕ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рдкреНрд░рдгрд╛рд▓реА рд╣реИред рдкреНрд░рдХрд╛рд░ рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реЛрддреЗ рд╣реИрдВ:
*
- рдпрд╣ рдПрдХ рд╕рд░рд▓, рдЧреИрд░-рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП Bool
, Char
рдЗрддреНрдпрд╛рджрд┐ред рдХрд╕реНрдЯрдо data Foo = Bar | Buz (Maybe Foo) | Quux [Int]
рдкреНрд░рдХрд╛рд░ data Foo = Bar | Buz (Maybe Foo) | Quux [Int]
data Foo = Bar | Buz (Maybe Foo) | Quux [Int]
data Foo = Bar | Buz (Maybe Foo) | Quux [Int]
рднреА рд╕рд░рд▓ рд╣реЛрдЧрд╛: Foo тИ╖ *
, рдХреНрдпреЛрдВрдХрд┐ рдЯрд╛рдЗрдк рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХрд╛ рдХреЛрдИ рдкреИрд░рд╛рдореАрдЯрд░ рдирд╣реАрдВ рд╣реИ (рд╣рд╛рд▓рд╛рдБрдХрд┐ рдЗрд╕рдХреЗ рдбреЗрдЯрд╛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╣реИрдВ)тАж тЖТ тАж
- рдпрд╣ рдПрдХ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдкреНрд░рдХрд╛рд░ рд╣реИ, рдпрд╣ рджреАрд░реНрдШрд╡реГрддреНрдд рдХреЗ рд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ *
рдФрд░ тЖТ
рдмрдирд╛ рдХреЛрдИ рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП: [] тИ╖ * тЖТ *
, рдпрд╛ (,) тИ╖ * тЖТ (* тЖТ *)
рдпрд╛ рдХреБрдЫ рднреА рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓: ((* тЖТ *) тЖТ *) тЖТ (* тЖТ *)
ред
рдЗрди рд╕рднреА рдХрд╛ рдЕрд░реНрде рд╕рд░рд▓ рд╣реИ: рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ рдФрд░ рдкреНрд░рдХрд╛рд░ рдпрд╣ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдпреЗ рдлрд╝рдВрдХреНрд╢рди рдХреИрд╕реЗ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рд╕рд╣рднрд╛рдЧрд┐рддрд╛ рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо [Maybe]
рдирд╣реАрдВ рд▓рд┐рдЦ рд╕рдХрддреЗ, рдХреНрдпреЛрдВрдХрд┐ [] тИ╖ * тЖТ *
, рдЕрд░реНрдерд╛рдд, рдХреЛрд╖реНрдардХ рдХреЗ рддрд░реНрдХ рдореЗрдВ рджрдпрд╛рд▓реБрддрд╛ *
рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдФрд░ Maybe
рдЗрд╕рдореЗрдВ * тЖТ *
, рдЕрд░реНрдерд╛рдд, Maybe
рдпрд╣ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рднреА рд╣реИ, рдФрд░ рдпрджрд┐ рд╣рдо рдЗрд╕реЗ рддрд░реНрдХ рджреЗрддреЗ рд╣реИрдВ рддреЛ Int тИ╖ *
, рд╣рдореЗрдВ Maybe Int тИ╖ *
рдорд┐рд▓рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреЛрд╖реНрдардХ рдореЗрдВ рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ: [Maybe Int] тИ╖ *
ред рдЗрд╕ рддрд░рд╣ рдХреЗ рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд▓рд┐рдП, рдХрд╛рдЗрдВрдб рдореМрдЬреВрдж рд╣реИрдВред