рдореБрдЦреМрдЯрд╛ рд╢реНрд░реЗрдгреА

рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐


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

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

рдпрд╣ рд▓реЗрдЦ рдореЛрдЯреЗ рддреМрд░ рдкрд░ рдЕрдВрдЧреНрд░реЗрдЬреА рд╣рд╕реНрдХреЗрд▓ рд╡рд┐рдХреАрдмреВрдХ рд╕реЗ рдПрдХ рдЦрдВрдб (рдЙрдзрд╛рд░ рдЪрд┐рддреНрд░ рд╕рд╣рд┐рдд) рджреЛрд╣рд░рд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдЗрд╕рдХрд╛ рд╕реАрдзрд╛ рдЕрдиреБрд╡рд╛рдж рдирд╣реАрдВ рд╣реИред

рд╢реНрд░реЗрдгреА рдХреНрдпрд╛ рд╣реИ?



рдЙрджрд╛рд╣рд░рдг


рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП, рд╣рдо рдкрд╣рд▓реЗ рд╕рд░рд▓ рд╢реНрд░реЗрдгрд┐рдпреЛрдВ рдХреЛ рджрд░реНрд╢рд╛рдиреЗ рд╡рд╛рд▓реЗ рдЪрд┐рддреНрд░реЛрдВ рдХреЗ рдПрдХ рдЬреЛрдбрд╝реЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред рдЙрдирдХреЗ рдкрд╛рд╕ рд▓рд╛рд▓ рд╡реГрддреНрдд рдФрд░ рддреАрд░ рд╣реИрдВ:

рд▓рд╛рд▓ рд╡реГрддреНрдд "рд╡рд╕реНрддреБрдУрдВ" рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рддреАрд░ "рдЖрдХрд╛рд░рд┐рдХреА" рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреЗ рд╣реИрдВред

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

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

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


рддреЛ, рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рд╢реНрд░реЗрдгреА рдореЗрдВ рд╡рд╕реНрддреБрдУрдВ рдФрд░ рдЖрдХрд╛рд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
  1. рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдПрдХ рд╡рд░реНрдЧ (рд╕реЗрдЯ) рд╣реИ ред рд╡рд╕реНрддреБрдПрдВ рдХрд┐рд╕реА рднреА рдЗрдХрд╛рдИ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред
  2. рдХрд┐рд╕реА рднреА рджреЛ рд╡рд╕реНрддреБрдУрдВ A рдФрд░ B , рдЖрдХреГрддрд┐ рд╡рд┐рдЬреНрдЮрд╛рди Hom(A,B) рдХреЗ рд╡рд░реНрдЧ Hom(A,B) рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕ рд╡рд░реНрдЧ рд╕реЗ рдПрдХ рдЖрдХрд╛рд░рд┐рдХреА f рд▓рд┐рдП, рд╡рд╕реНрддреБ A рдХреЛ рдПрдХ рдХреНрд╖реЗрддреНрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ B рдХреЛ рд╕рд╣ - рдХреНрд╖реЗрддреНрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ ред рдпрд╣ рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦрд╛ рд╣реИ:
    f тИИ Hom(A,B) рдпрд╛ f : A тЖТ B
  3. рдХрд┐рд╕реА рднреА рджреЛ рд░реВрдкрдХреЛрдВ рдХреЗ рд▓рд┐рдП f : A тЖТ B рдФрд░ g : B тЖТ C , рдЙрдирдХреА рд░рдЪрдирд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ - рд░реВрдкрд╡рд╛рдж h = g тИШ f , рдореЗрдВ
    h : A тЖТ C рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдХреНрд╖реЗрддреНрд░ g рдФрд░ рд╕рд╣ рдХреНрд╖реЗрддреНрд░ f рд╕рдВрдпреЛрдЧ рд╣реИред
  4. рд░рдЪрдирд╛ рд╕рд╛рд╣рдЪрд░реНрдп рд╣реИ , рдЬреЛ рдХрд┐ рдХрд┐рд╕реА рднреА рдЖрдХрд╛рд░рд┐рдХреА f : A тЖТ B , g : B тЖТ C рдФрд░ h : C тЖТ D , рд╕рдорд╛рдирддрд╛
    (h тИШ g) тИШ f = h тИШ (g тИШ f)
  5. рдХрд┐рд╕реА рднреА рд╡рд╕реНрддреБ A рдПрдХ "рдЗрдХрд╛рдИ" рдЖрдХрд╛рд░рд┐рдХреА рд╣реИ, рдЬрд┐рд╕реЗ id A : A тЖТ A рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реВрдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдпрд╣ рд░рдЪрдирд╛ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рддрдЯрд╕реНрде рд╣реИ, рдЕрд░реНрдерд╛рдд, рдХрд┐рд╕реА рднреА рд░реВрдкрд╡рд╛рдж рдХреЗ рд▓рд┐рдП f : A тЖТ B , рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд░рдЦрддреА рд╣реИ:
    id B тИШ f = f = f тИШ id A
рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рд╕реВрдЪрдХрд╛рдВрдХ рдореБрдЭреЗ рдкрд░реЗрд╢рд╛рди рдХрд░реЗрдЧрд╛ рдФрд░ рдореИрдВ рд╕рд┐рд░реНрдл id рд▓рд┐рдЦреВрдВрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛ рдХреНрд╖реЗрддреНрд░ / рд╕рд╣-рдХреНрд╖реЗрддреНрд░ рд╕рдВрджрд░реНрдн рд╕реЗ рдмрд╣рд╛рд▓ рд╣реИред

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

рд╕реЗрд▓реНрдл рдПрдХреНрд╕рд░рд╕рд╛рдЗрдЬ рдПрдХреНрд╕рд░рд╕рд╛рдЗрдЬ: рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЗрдореЗрдЬ рдПрдХ рд╢реНрд░реЗрдгреА рд╣реИ



рдореБрдЦреМрдЯрд╛ рд╢реНрд░реЗрдгреА


рдФрд░ рдЕрдм рдореБрдЦреНрдп рдЙрджрд╛рд╣рд░рдг, рд▓реЗрдЦ рдХрд╛ рдореБрдЦреНрдп рд╡рд┐рд╖рдпред рд╣рд╕реНрдХ рд╢реНрд░реЗрдгреА рдореЗрдВ рд╣рд╛рд╕реНрдХреЗрд▓ рднрд╛рд╖рд╛ рдХреЗ рдкреНрд░рдХрд╛рд░ рдФрд░ рдЙрдирдХреЗ рдмреАрдЪ рдХреЗ рдХрд╛рд░реНрдп рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдЕрдзрд┐рдХ рд╕рдЦреНрддреА рд╕реЗ:
  1. рд╣рд╕реНрдХ рдСрдмреНрдЬреЗрдХреНрдЯ: 1 * рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрджрд┐рдо рдкреНрд░рдХрд╛рд░: Integer , Bool , Char , рдЖрджрд┐ред "рдЯрд╛рдЗрдк" Maybe рдХрд┐ рдПрдХ рддрд░рд╣ рдХрд╛ * тЖТ * , рд▓реЗрдХрд┐рди Maybe Bool рдкреНрд░рдХрд╛рд░ рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ * рдФрд░ рдЗрд╕рд▓рд┐рдП рд╣рд╛рд╕реНрдХ рдореЗрдВ рдПрдХ рд╡рд╕реНрддреБ рд╣реЛред рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рд╕рдорд╛рди, рд▓реЗрдХрд┐рди рдмрд╛рдж рдореЗрдВ рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВред рдкрджрдирд╛рдо: a тИ╖ * тЙб " a рдкреНрд░рдХрд╛рд░ рд╣реИ * " a " a рд╣реИрд╕реНрдХ рдореЗрдВ рдПрдХ рд╡рд╕реНрддреБ рд╣реИ"ред
  2. рд╣рд╕реНрдХ рдореЙрд░реНрдлрд┐рдЬреНрдо : рдХреЛрдИ рднреА рд╣рд╛рд╕реНрдХреЗрд▓ рдПрдХ рд╡рд╕реНрддреБ рд╕реЗ рджреВрд╕рд░реЗ рдкреНрд░рдХрд╛рд░ (рдкреНрд░рдХрд╛рд░) рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ a, b тИ╖ * , рддреЛ рдлрд╝рдВрдХреНрд╢рди f тИ╖ a тЖТ b рдХреНрд╖реЗрддреНрд░ рдФрд░ рд╕рд╣-рдХреНрд╖реЗрддреНрд░ b рд╕рд╛рде рдПрдХ рд░реВрдкрд╡рд╛рдж рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╡рд╕реНрддреБрдУрдВ a рдФрд░ b рдмреАрдЪ рдЖрдХрд╛рд░рд┐рдХреА рдХреЗ рд╡рд░реНрдЧ рдХреЛ a тЖТ b рдкреНрд░рдХрд╛рд░ рджреНрд╡рд╛рд░рд╛ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЧрдгрд┐рддреАрдп рд╕рдВрдХреЗрддрди рдХреЗ рд╕рд╛рде рд╕рд╛рджреГрд╢реНрдп рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░реНрдпрд╛рдпрд╡рд╛рдЪреА рдХреЛ рджрд░реНрдЬ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
     type Hom(a,b) = a тЖТ b 
    рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЬрд╛рд░реА рдирд╣реАрдВ рд░рдЦреВрдВрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рддреАрд░, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рд╕реНрдкрд╖реНрдЯ рд╣реИред
  3. рд░рдЪрдирд╛: рдорд╛рдирдХ рдлрд╝рдВрдХреНрд╢рди (.) тИ╖ (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) 
  4. рдЗрд╕ рдкрд░рд┐рднрд╛рд╖рд╛ рд╕реЗ рд░рдЪрдирд╛ рдХреА рд╕рдВрдмрджреНрдзрддрд╛ рд╕реНрдкрд╖реНрдЯ рд╣реИ: рдХрд┐рд╕реА рднреА рддреАрди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП
    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)) 
  5. рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП 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 рдХреА рджреЛ рднреВрдорд┐рдХрд╛рдПрдБ рд╣реИрдВ:
  1. рд╢реНрд░реЗрдгреА C рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдСрдмреНрдЬреЗрдХреНрдЯ A рд╢реНрд░реЗрдгреА D рд╕реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ рдФрд░ F(A) рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реВрдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
  2. рдкреНрд░рддреНрдпреЗрдХ рдЖрдХрд╛рд░рд╡рд╛рдж 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) 

рддрд╕реНрд╡реАрд░ рдореЗрдВ, рдкрд╣рд▓рд╛ рдкреНрд░рджрд░реНрд╢рди рдкреАрд▓реЗ рдзрд░рд╛рд╢рд╛рдпреА рддреАрд░ рдХреЗ рд╕рд╛рде рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ рдиреАрд▓реЗ рд░рдВрдЧ рдХреЗ рд╕рд╛рде:


рджреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреНрд░рд╛рдХреГрддрд┐рдХ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрдЯрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
  1. рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдПрдХрд▓ рдЖрдХрд╛рд░ рдХреЛ рдЕрдкрдиреА рдЫрд╡рд┐ рдХреЗ рдПрдХрд▓ рдЖрдХрд╛рд░рд╡рд╛рдж рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
    F(id A ) = id F(A)
  2. рдЙрд╕реЗ рдЖрдХрд╛рд░ рдХреА рд░рдЪрдирд╛ рдХрд╛ рдЕрдкрдиреА рдЫрд╡рд┐рдпреЛрдВ рдХреА рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:
    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 рд╢реНрд░реЗрдгреА рдХреА рдХреБрдВрдЬреА рдореЗрдВ рдкреНрд░рд╛рдХреГрддрд┐рдХ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ, рдордареЛрдВ рдФрд░ рдЕрдиреНрдп рд╢реНрд░реЗрдгреАрдмрджреНрдз рдирд┐рд░реНрдорд╛рдгреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдлрд┐рд░, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рдЧрдгрд┐рддреАрдп рдПрдирд╛рд▓реЙрдЧреНрд╕ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧреА рд╣реЛрдВрдЧреЗ, рдЬрд┐рд╕рд╕реЗ рдЖрдк рдЗрди рднрд╛рд╖рд╛ рдирд┐рд░реНрдорд╛рдгреЛрдВ рдХреА рдЖрдВрддрд░рд┐рдХ рдкреНрд░рдХреГрддрд┐ рдХреЛ рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рд╕рдордЭ рдкрд╛рдПрдВрдЧреЗ рдФрд░ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдФрд░ рдЕрдзрд┐рдХ рд╕рдЪреЗрдд рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд░ рдкрд╛рдПрдВрдЧреЗред

  1. рдпрджрд┐ рдХрд┐рд╕реА рдХреЛ рдкрд╣рд▓реЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИ, рддреЛ рдореИрдВ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рд╕рдордЭрд╛рддрд╛ рд╣реВрдВред рдХрд┐рдВрдбреНрд╕ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░реЛрдВ рдкрд░ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рдкреНрд░рдгрд╛рд▓реА рд╣реИред рдкреНрд░рдХрд╛рд░ рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реЛрддреЗ рд╣реИрдВ:
    • * - рдпрд╣ рдПрдХ рд╕рд░рд▓, рдЧреИрд░-рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП 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] тИ╖ * ред рдЗрд╕ рддрд░рд╣ рдХреЗ рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд▓рд┐рдП, рдХрд╛рдЗрдВрдб рдореМрдЬреВрдж рд╣реИрдВред

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


All Articles