рд╣рд╛рдп, рд╣реИрдмреНрд░ред
рджреВрд╕рд░реЗ рджрд┐рди, рдореЗрд░реЗ рдПрдХ рд╢реМрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ, рдЯрд╛рд╕реНрдХ рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдХрд╛ рднрдВрдбрд╛рд░ рд▓рд┐рдЦрдиреЗ рдХрд╛ рд╣реБрдЖред
рдпрд╣ рдХрд╛рд░реНрдп рд╕реНрд╡рдпрдВ рд╣реА рдмрд╣реБрдд рд╕рд░рд▓рддрд╛ рд╕реЗ рд╣рд▓ рд╣реЛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рд╛рд╕реНрдХреЗрд▓ рдХреЗ рд╕рд╛рде рдореЗрд░реА рд╕рдорд╕реНрдпрд╛ (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдореЗрд░реЗ рдЕрдкрдиреЗ рдордиреЛрд░рдВрдЬрди рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ) рдпрд╣ рд╣реИ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдХреЗрд╡рд▓ рд▓реЗрдирд╛ рдФрд░ рд╣рд▓ рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИред рдпрд╣ рддрдп рдХрд░рдирд╛, рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛, рдЕрдореВрд░реНрдд, рдЕрдореВрд░реНрдд рдХрд░рдирд╛ рдФрд░ рдлрд┐рд░ рдЖрдЧреЗ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рднрдВрдбрд╛рд░рдг рдХреЛ рдПрдХреНрд╕реНрдЯреЗрдВрд╕рд┐рдмрд▓ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рддрд╛рдХрд┐ рд╡реЗ рдкрд╣рд▓реЗ рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рди рдХрд░реЗрдВ рдХрд┐ рд╡реЗ рд╡рд╣рд╛рдВ рдХреНрдпрд╛ рд╣реЛрдВрдЧреЗред рдпрд╣ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╖рдп рд╣реИ, рдФрд░ рдЖрдЬ рд╣рдо рдПрдХ рдЫреЛрдЯреЗ рдШрдЯрдХ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ: рдкрд╣рд▓реЗ рд╕реЗ рдЕрдЬреНрдЮрд╛рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рдХрд╛рд░-рд╕реБрд░рдХреНрд╖рд┐рдд рдЖрд╡рд░рдг рд▓рд┐рдЦрдирд╛ред рдбрд╛рдпрдиреЗрдорд┐рдХ рдЯрд╛рдЗрдкрд┐рдВрдЧ рдЬреИрд╕рд╛ рдХреБрдЫ, рд▓реЗрдХрд┐рди рд╕реНрдерд┐рд░ рдЧрд╛рд░рдВрдЯреА рдХреЗ рд╕рд╛рде рдХрд┐ рд╣рдо рдмрдХрд╡рд╛рд╕ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд▓реЗрдЦ, рдЕрдиреБрднрд╡реА рд╣рд╛рд╕реНрдХреЗрд▓рд┐рд╕реНрдЯреЛрдВ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдирдпрд╛ рдирд╣реАрдВ рдЦреЛрд▓реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдЕрдм рд╣рдо рдХрдо рд╕реЗ рдХрдо рдЗрд╕ рдШрдЯрдХ рдХреЛ рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ рдХрд░ рджреЗрдВрдЧреЗ рдФрд░ рдмрд╛рдж рдХреЗ рд▓реЗрдЦреЛрдВ рдореЗрдВ рдЗрд╕рд╕реЗ рд╡рд┐рдЪрд▓рд┐рдд рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред рдареАрдХ рд╣реИ, рдпрд╛ рдЖрдк рдЗрддрдиреЗ рд╡рд┐рдирдореНрд░ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдореИрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреВрд░реЗ рдбрд┐рдЬрд╛рдЗрди рдкреИрдЯрд░реНрди рдХреЗ рд╕рд╛рде рдЖрдпрд╛ рд╣реВрдВред
рддреЛ, рдкрд╣рд▓реЗ рд╣рдо рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕реВрддреНрд░реАрдХрд░рдг рдХрд░рддреЗ рд╣реИрдВред рд╣рдореЗрдВ рдХреБрдЫ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдкрд╣рд▓реЗ рдЕрдЬреНрдЮрд╛рдд рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╛, рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдкрд╣рд▓реЗ рдХреЗ рдЕрдЬреНрдЮрд╛рдд рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рди рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдирдЪрд┐рддреНрд░ рдореЗрдВ рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВред
рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рд╣рдо рдкрд╛рдЧрд▓ рдирд╣реАрдВ рд╣реИрдВ рдФрд░ рд╣рдореЗрдВ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рдорд░реНрдерди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред рд╣рдореЗрдВ рдЖрджреЗрд╢ рджреЗрдиреЗ рдХреЗ рдЕрд░реНрде рдореЗрдВ рдкреНрд░рдХрд╛рд░ (рднрд▓реЗ рд╣реА рдЕрдЬреНрдЮрд╛рдд) рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рд╛рд╕реНрдХреЗрд▓ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдо рдЙрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ Ord a
рд╡рд░реНрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдо рд╣реИрд╢ рд▓реЗрдиреЗ рдФрд░ рд╕рдорд╛рдирддрд╛ рдХреА рдЬрд╛рдБрдЪ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдХреА рдорд╛рдВрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХрдИ рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдпрд╣ рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЦреБрдж рдХреЛ рд╕реАрдорд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдФрд░ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдЧрд╛ред
рдЬрдм рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд░реНрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬреНрдЮрд╛рдд рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреА рдмрд╛рдд рдЖрддреА рд╣реИ, рддреЛ рдЖрдорддреМрд░ рдкрд░ рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рдЕрд╕реНрддрд┐рддреНрд╡рдЧрдд рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
data SomeOrd where MkSomeOrd :: Ord a => a -> SomeOrd
рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рд╣рдореЗрдВ SomeOrd
рдкреНрд░рдХрд╛рд░ рдХрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╣рдордиреЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдкреИрдЯрд░реНрди рдорд┐рд▓рд╛рди рдХрд┐рдпрд╛ рд╣реИ:
foo :: SomeOrd -> Bar foo (MkSomeOrd val) = ... (1) ...
рдЙрд╕рдХреЗ рдмрд╛рдж (1)
рд╣рдо рдпрд╣ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреА val
рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ (рдФрд░, рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд, рдЯрд╛рдЗрдорд░ рднреА рдЬрд╛рдирддрд╛ рд╣реИ) рдХрд┐ val
рдСрд░реНрдбреЗрдХреНрд▓рд╛рд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрджрд┐ рд╡рд░реНрдЧ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛рд░реНрдп рджреЛ (рдпрд╛ рдЕрдзрд┐рдХ) рддрд░реНрдХ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕ рддрд░рд╣ рдХреЗ рд░рд┐рдХреЙрд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдмрд╣реБрдд рдХрдо рд╣реЛрддрд╛ рд╣реИ:
tryCompare :: SomeOrd -> SomeOrd -> Bool tryCompare (MkSomeOrd val1) (MkSomeOrd val2) = ?
Ord
рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ val
рдФрд░ val
рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдирд╣реАрдВ рд╣реИ! рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ SomeOrd
рдмреЗрдХрд╛рд░ рд╣реИред рдХреНрдпрд╛ рдХрд░реЗрдВ?
рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рд╣рд╛рд╕реНрдХреЗрд▓ рдПрдХ рдЖрдХреНрд░рд╛рдордХ рднрд╛рд╖рд╛ рд╣реИ рдЬреЛ рдЖрдХреНрд░рд╛рдордХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрдиреНрдореВрд▓рди рдХреЗ рд╕рд╛рде рд╣реИ (рд╕рдВрдХрд▓рди рдХреЗ рдмрд╛рдж, рд╡реЗ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рд╡рд╣рд╛рдВ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ), рдХрдВрдкрд╛рдЗрд▓рд░ рдЕрднреА рднреА рд░рдирдЯрд╛рдЗрдо рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреВрдЫрд╛ рдЬрд╛рдПред рдкреНрд░рдХрд╛рд░ рдХрд╛ рд░реЛрд▓ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдЯрд╛рдЗрдк рдЯрд╛рдЗрдк a
рдХрд╛ рдорд╛рди TypeRep a
, рдФрд░ рдкреНрд░рд╛рд░реНрдердирд╛ рдЬрдирд░реЗрд╢рди рдХрд╛ рдЬрд╡рд╛рдм рдЯрд╛рдЗрдк рдХрд░рдиреЗ Typeable
рдЯрд╛рдЗрдкрдХрд╛рд╕реНрдЯ рджреНрд╡рд╛рд░рд╛ рджрд┐рдпрд╛ Typeable
ред
рд╡реИрд╕реЗрд╡реИрд╕реЗ, рд╕рд╛рдорд╛рдиреНрдп рдЕрд░реНрдереЛрдВ рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реЛрдирд╛ рдЬрд░реВрд░реА рдирд╣реАрдВ рд╣реИ, рдЕрд░реНрдерд╛рдд рдПрдХ рдХрд┐рд╕реНрдо рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред рдпрд╣ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ рдЖрдкрдХреЛ рд╕реАрдЦреЗ рд╣реБрдП рдкреНрд░рдХрд╛рд░реЛрдВ рдФрд░ рдкрд╕рдВрдж рдХреЗ рд░рдирдЯрд╛рдЗрдо рдкреНрд░рддрд┐рдирд┐рдзрд┐рдпреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдХреБрдЫ рд╢рд╛рдВрдд рдЪреАрдЬреЗрдВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рд╣реИред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ rep1 :: TypeRep a, rep2 :: TypeRep b
рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ rep1 :: TypeRep a, rep2 :: TypeRep b
, рддреЛ рд╣рдо рдЙрдирдХреА рддреБрд▓рдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЬрд╛рдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреЗ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдЧрд░ рд╡реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЬрд╛рд╣рд┐рд░ рд╣реИ рдХрд┐ b
рдХреЗ рд╕рд╛рде a
рд╕рдВрдпреЛрдЧ рд╣реИред рдФрд░, рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд╕рдорд╛рдирддрд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд┐рд░реВрдкрдг рдХреА рдЬрд╛рдБрдЪ рдХрд╛ рдХрд╛рд░реНрдп рдПрдХ рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИ рдЬреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЯрд╛рдЗрдкрдХрд░реНрддрд╛ рдХреЛ рд╕рдордЭрд╛ рд╕рдХрддрд╛ рд╣реИ:
eqTypeRep :: forall k1 k2 (a :: k1) (b :: k2). TypeRep a -> TypeRep b -> Maybe (a :~~: b)
рдпрд╣рд╛рдБ рдХреНрдпрд╛ рдмрдХрд╡рд╛рд╕ рд▓рд┐рдЦреА рдЧрдИ рд╣реИ?
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, eqTypeRep
рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИред
рджреВрд╕рд░реЗ, рдпрд╣ рдмрд╣реБрд░реВрдкреА рд╣реИ, рд▓реЗрдХрд┐рди рди рдХреЗрд╡рд▓ рдкреНрд░рдХрд╛рд░ рд╕реЗ, рдмрд▓реНрдХрд┐ рдЗрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреА рдХрд┐рд╕реНрдореЛрдВ рджреНрд╡рд╛рд░рд╛ рднреАред рдпрд╣ рднрд╛рдЧ forall k1 k2 (a :: k1) (b :: k2)
рджреНрд╡рд╛рд░рд╛ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ - рдЗрд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ a
рдФрд░ b
рди рдХреЗрд╡рд▓ Int
рдпрд╛ [String]
рдЬреИрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХрд╛рд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреБрдЦреНрдпрд╛рдд рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ (рджреЗрдЦреЗрдВ) DataKinds рдФрд░ рд╣рд╛рд╕реНрдХреЗрд▓ рдкреНрд░рдорд╛рдгрд┐рдд рдХрд░рдиреЗ рдХреЗ рдЕрдиреНрдп рдкреНрд░рдпрд╛рд╕)ред рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдпрд╣ рд╕рдм рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИред
рддреАрд╕рд░рд╛, рдпрд╣ рд╕рдВрднрд╛рд╡рд┐рдд рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рджреЛ рд░рдирдЯрд╛рдЗрдо рдирд┐рд░реВрдкрдг рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, TypeRep a
рдФрд░ TypeRep b
ред
рдЪреМрдерд╛, рдпрд╣ Maybe (a :~~: b)
рдкреНрд░рдХрд╛рд░ рдХрд╛ рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИ Maybe (a :~~: b)
ред рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдпрд╣рд╛рдБ рд╣реЛрддреА рд╣реИред
рдпрджрд┐ рдкреНрд░рдХрд╛рд░ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддреЗ рд╣реИрдВ, рддреЛ рдлрд╝рдВрдХреНрд╢рди рд╕рд╛рдорд╛рдиреНрдп Nothing
рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдФрд░ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИред рдпрджрд┐ рдкреНрд░рдХрд╛рд░ рдореЗрд▓ рдЦрд╛рддреЗ рд╣реИрдВ, рддреЛ рдлрд╝рдВрдХреНрд╢рди Just val
, рдЬрд╣рд╛рдВ val
рдЯрд╛рдЗрдк a :~~: b
ред рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реИ:
рдЕрдм рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдореЗрдВ a :~~: b
рдХрд╛ рд╡реИрд▓реНрдпреВ рд╡реИрд▓реНрдпреВ рдорд┐рд▓рддрд╛ рд╣реИред рдЗрд╕реЗ рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ HRefl
рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рд╕рд╛рде рд╣реИ, рдФрд░ рдЗрд╕ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдЖрдЗрдХрди рдХреЗ рджреЛрдиреЛрдВ рдХрд┐рдирд╛рд░реЛрдВ рдкрд░ рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ :~~:
рдпрд╣ рд╕рдорд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рд▓рд┐рдП, b
рдХреЗ рд╕рд╛рде a
рд╕рдВрдпреЛрдЧ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдЧрд░ рд╣рдо val
рдкрд░ zapternnom-match рдХрд░рддреЗ рд╣реИрдВ, рддреЛ taypcheker рдХреЛ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рдкрддрд╛ рдЪрд▓ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рд╣рд╛рдБ, eqTypeRep
рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рдорд╛рдг рджреЗрддрд╛ рд╣реИ рдХрд┐ рджреЛ рд╕рдВрднрд╛рд╡рд┐рдд рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рд╕рдорд╛рди рд╣реИрдВ рдпрджрд┐ рд╡реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдорд╛рди рд╣реИрдВред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдКрдкрд░ рдХреЗ рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдореЗрдВ, рдореИрдВрдиреЗ рдЭреВрда рдмреЛрд▓рд╛ рдерд╛ред рдХреЛрдИ рд╣рдореЗрдВ рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рдХреБрдЫ рд▓рд┐рдЦрдиреЗ рд╕реЗ рдирд╣реАрдВ рд░реЛрдХ рд░рд╣рд╛ рд╣реИ
wrong :: Int :~~: String wrong = wrong
рдпрд╛
wrong :: Int :~~: String wrong = undefined
рдпрд╛ рдереЛрдбрд╝рд╛ рдХрдо рд╕реНрдкрд╖реНрдЯ рддрд░реАрдХреЛрдВ рдХреЗ рдПрдХ рд╕рдореВрд╣ рдХреЗ рд╕рд╛рде рд╕рд┐рд╕реНрдЯрдо рдХреЛ рддреЛрдбрд╝ рджреЗрдВред рдпрд╣ рд╕рдВрдХреАрд░реНрдг рдШреЗрд░реЗ рдореЗрдВ рдЬрд╛рдиреЗ-рдорд╛рдиреЗ рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рд╣рд╛рд╕реНрдХреЗрд▓ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрд╕рдВрдЧрдд рд╣реИред рдордЬрдмреВрдд рдкреНрд░рдХрд╛рд░ рдХреА рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рд╡рд╛рд▓реА рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ, рдРрд╕реА рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдкрд░ рдореБрд╣рд░ рдирд╣реАрдВ рд▓рдЧрддреА рд╣реИред
рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдкреНрд░рд▓реЗрдЦрди рдХреЗ рдЯреБрдХрдбрд╝реЗ рдореЗрдВ рдмрд╕ рдКрдкрд░ рдЙрджреНрдзреГрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╕рдорд╛рдкреНрддрд┐ рдореВрд▓реНрдп рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдКрдкрд░ wrong
рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рджреЛрдиреЛрдВ рд╕рдВрд╕реНрдХрд░рдг рдЗрд╕ рдмрд╣реБрдд рд╣реА рд╕рдорд╛рдкреНрддрд┐ рдореВрд▓реНрдп рдХрд╛ рдЙрддреНрдкрд╛рджрди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рд╣рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕рд╛ рдХрд╛рд░рдг рдФрд░ рдЖрддреНрдорд╡рд┐рд╢реНрд╡рд╛рд╕ рджреЗрддрд╛ рд╣реИ: рдпрджрд┐ рд╣рд╛рд╕реНрдХреЗрд▓ рдкрд░ рд╣рдорд╛рд░рд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ (рдФрд░ undefined
рдореЗрдВ рдирд╣реАрдВ рдЪрд▓рд╛ рдЧрдпрд╛), рддреЛ рдЗрд╕рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд▓рд┐рдЦрд┐рдд рдкреНрд░рдХрд╛рд░реЛрдВ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред рдпрд╣рд╛рдБ, рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЖрд▓рд╕реНрдп рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдХреБрдЫ рд╡рд┐рд╡рд░рдг рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕ рд╡рд┐рд╖рдп рдХреЛ рдирд╣реАрдВ рдЦреЛрд▓реЗрдВрдЧреЗред
рдФрд░ рд╡реИрд╕реЗ, рдКрдкрд░ рджрд┐рдП рдЧрдП рдХреЛрдб рдореЗрдВ рд╣рд╛рд╕реНрдХреЗрд▓ рдХреА рдХрдордЬреЛрд░реА рдХрд╛ рджреВрд╕рд░рд╛ рд░реВрдк eqTypeRep
рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИред рдордЬрдмреВрдд рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ, рдпрд╣ рдПрдХ рдордЬрдмреВрдд рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рдореВрд▓реНрдп рд▓реМрдЯрд╛рдПрдЧрд╛, рдЬреЛ рди рдХреЗрд╡рд▓ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдорд╛рди рд╣реЛрдиреЗ рдкрд░, рдкреНрд░рдХрд╛рд░ рдХреА рд╕рдорд╛рдирддрд╛ рдХреЛ рд╕рд╛рдмрд┐рдд рдХрд░реЗрдЧрд╛, рдмрд▓реНрдХрд┐ рдЕрдЧрд░ рд╡реЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрд╕рдорд╛рди рд╣реИрдВ, рддреЛ рдЙрдирдХреА рдЕрд╕рдорд╛рдирддрд╛ рднреА рд╕рд╛рдмрд┐рдд рд╣реЛрдЧреАред рд╣рд╛рд╕реНрдХреЗрд▓ рддрд░реНрдХ рдХреА рдЕрд╕рдВрдЧрддрд┐, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдереЛрдбрд╝рд╛ рд╡реНрдпрд░реНрде рдХрд░ рджреЗрддреА рд╣реИ: рдпрд╣ рд╕рдм рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдЬрдм рдЖрдк рднрд╛рд╖рд╛ рдХреЛ рдкреНрд░рдореЗрдп рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ, рдФрд░ рд╣рд╕реНрдХреЗрд▓ рдХреЛ рдПрдХ рдХрд╣рд╛рд╡рдд рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред
рдУрд╣, рд▓реЙрдЧ рдФрд░ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рдЖрдЗрдП рдЕрдкрдиреЗ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВред рдЕрдм рдмрд╕ рдПрдХ рдЙрд▓реНрд▓реВ рдЦреАрдВрдЪреЛ рд╕рдВрдХреЗрдд рдХреЗ рдКрдкрд░ рдЪрд░реНрдЪрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╣рдорд╛рд░реЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреЗ рдкреНрд░рдХрд╛рд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ рдпрд╣ рднреА рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдордп рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╣реИ, рдФрд░ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред
рдпрд╣ рд╣рдорд╛рд░реЗ рдЖрд╡рд░рдг рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдУрд░ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИ:
data Dyn where Dyn :: Ord a => TypeRep a -> a -> Dyn toDyn :: (Typeable a, Ord a) => a -> Dyn toDyn val = Dyn (typeOf val) val
рдЕрдм рд╣рдо рдПрдХ рдлрдВрдХреНрд╢рди рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдЬреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ:
- рдкреНрд░рдХрд╛рд░
Dyn
рджреЛ рдореВрд▓реНрдп; - рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рджреЛ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдкреИрджрд╛ рдХрд░рддрд╛ рд╣реИ,
forall
(рдЬрдм рдЗрд╕рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ) рдмрдирд╛рдиреЗ рдХреЗ рджреМрд░рд╛рди рдХреЗрд╡рд▓ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЗ рдЖрдзрд╛рд░ рдкрд░,
рдФрд░ рдЬрд┐рд╕реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрджрд┐ рджреЛрдиреЛрдВ Dyn
рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреЗ рд╣реИрдВ; - рдФрд░ рдлрд╝реЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди, рдЬрд┐рд╕реЗ рдкрд┐рдЫрд▓реЗ рдПрдХ рдХреЗ рдмрдЬрд╛рдп рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрджрд┐ рдкреНрд░рдХрд╛рд░ рдЕрднреА рднреА рдЕрд▓рдЧ рд╣реИрдВ:
withDyns :: (forall a. Ord a => a -> a -> b) -> (SomeTypeRep -> SomeTypeRep -> b) -> Dyn -> Dyn -> b withDyns f def (Dyn ty1 v1) (Dyn ty2 v2) = case eqTypeRep ty1 ty2 of Nothing -> def (SomeTypeRep ty1) (SomeTypeRep ty2) Just HRefl -> f v1 v2
SomeTypeRep
рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП TypeRep a
рдКрдкрд░ рдПрдХ рдЕрд╕реНрддрд┐рддреНрд╡рдЧрдд рдЖрд╡рд░рдг a
ред
рдЕрдм рд╣рдо рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рдорд╛рдирддрд╛ рдХреА рдЬрд╛рдБрдЪ рдФрд░ рддреБрд▓рдирд╛:
instance Eq Dyn where (==) = withDyns (==) (\_ _ -> False) instance Ord Dyn where compare = withDyns compare compare
рдпрд╣рд╛рдВ рд╣рдордиреЗ рдЗрд╕ рддрдереНрдп рдХрд╛ рд▓рд╛рдн рдЙрдард╛рдпрд╛ рдХрд┐ SomeTypeRep
рдХреА рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдСрд░реНрдбрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╛рд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рдХреА compare
рднреА рдХреА рдЬрд╛рддреА рд╣реИред
рд╣реЛ рдЧрдпрд╛ред
рдХреЗрд╡рд▓ рдЕрдм рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рдирд╣реАрдВ рдХрд░рдирд╛ рдкрд╛рдк рд╣реИ: рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ Dyn
рднреАрддрд░, toDyn
, withDyns
рд╣рдо рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ Ord
рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХрд╛ рдХреЛрдИ рдЕрдиреНрдп рд╕реЗрдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо ConstraintKinds
рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЛ рд╕рдХреНрд╖рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ Dyn
рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ Dyn
рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реЗрдЯ рдХреЗ Dyn
рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╣рдо рд╣рдорд╛рд░реЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдп рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ:
data Dyn ctx where Dyn :: ctx a => TypeRep a -> a -> Dyn ctx toDyn :: (Typeable a, ctx a) => a -> Dyn ctx toDyn val = Dyn (typeOf val) val withDyns :: (forall a. ctx a => a -> a -> b) -> (SomeTypeRep -> SomeTypeRep -> b) -> Dyn ctx -> Dyn ctx -> b withDyns (Dyn ty1 v1) (Dyn ty2 v2) f def = case eqTypeRep ty1 ty2 of Nothing -> def (SomeTypeRep ty1) (SomeTypeRep ty2) Just HRefl -> f v1 v2
рдлрд┐рд░ Dyn Ord
рд╣рдорд╛рд░реА Dyn Monoid
рдкреНрд░рдХрд╛рд░ рд╣реЛрдЧрд╛, рдФрд░, рдХрд╣реЗрдВрдЧреЗ, Dyn Monoid
рдЖрдкрдХреЛ рдордирдорд╛рдиреЗ рддрд░реАрдХреЗ рд╕реЗ Dyn Monoid
рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдФрд░ рдЙрдирдХреЗ рд╕рд╛рде рдХреБрдЫ Dyn Monoid
рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред
рдЖрдЗрдП рд╣рдо рдЕрдкрдиреЗ рдирдП Dyn
рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдЙрджрд╛рд╣рд░рдг рд▓рд┐рдЦреЗрдВ:
instance Eq (Dyn Eq) where (==) = withDyns (==) (\_ _ -> False) instance Ord (Dyn Ord) where compare = withDyns compare compare
... рдХреЗрд╡рд▓ рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЯрд╛рдЗрдкрдХрд░реНрддрд╛ рдХреЛ рдпрд╣ рдирд╣реАрдВ рдкрддрд╛ рд╣реИ рдХрд┐ Dyn Ord
Eq
рднреА рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ,
рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдкреВрд░реА рдкрджрд╛рдиреБрдХреНрд░рдо рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдиреА рд╣реЛрдЧреА:
instance Eq (Dyn Eq) where (==) = withDyns d1 d2 (==) (\_ _ -> False) instance Eq (Dyn Ord) where (==) = withDyns d1 d2 (==) (\_ _ -> False) instance Ord (Dyn Ord) where compare = withDyns d1 d2 compare compare
рдЕрдЪреНрдЫрд╛, рдЕрдм рдкрдХреНрдХрд╛ред
... рд╢рд╛рдпрдж, рдПрдХ рдЖрдзреБрдирд┐рдХ рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ, рдЖрдк рдЗрд╕реЗ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдЯрд╛рдЗрдорд░ рд╣реА рдлреЙрд░реНрдо рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗ
instance C_i (Dyn (C_1, ... C_n)) where ...
рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣рд╛рдБ рдХреБрдЫ рдкреНрд░реЛрд▓рд┐рдХрд▓ рдирд┐рдХрд▓рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЗрд╕реЗ рдЕрднреА рддрдХ рдкреВрд░рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рдореБрдЭреЗ рдЗрд╕реЗ рдЪреБрдирдиреЗ рдХреЗ рд▓рд┐рдП рдмреИрдардирд╛ рд╣реЛрдЧрд╛ред рджреЗрдЦрддреЗ рд░рд╣реЛред
рдФрд░ рдпрд╣ рднреА, рдпрджрд┐ рдЖрдк рдзреНрдпрд╛рди рд╕реЗ рд╕реНрдХреНрд╡рд┐рдВрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░рд╛ Dyn
рдЧреБрдкреНрдд рднрд╛рд╖рд╛рдУрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ (ty : Type ** val : ty)
рдХреА рдПрдХ рдирд┐рд░реНрднрд░ рдЬреЛрдбрд╝реА рдХреА рддрд░рд╣ рд╕рдВрджрд┐рдЧреНрдз рд░реВрдк рд╕реЗ рджрд┐рдЦрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдореЗрд░реЗ рд▓рд┐рдП рдЬрд╛рдиреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдорд┐рд▓рд╛рди рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкрд╛рд░рдорд╛рд░реНрдерд┐рдХрддрд╛ (рдЬреЛ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, IMHO, рдмрд╣реБрдд рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреА рдЬрд╛рддреА рд╣реИ), рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдпрд╣ рд╕рдВрднрд╡ рд▓рдЧрддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд - рдЕрдм рдЖрдк рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ Map (Dyn Ord) SomeValue
рдЬреИрд╕реЗ рдХреБрдЫ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХреБрдВрдЬреА рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рд╕реА рднреА рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрдм рддрдХ рдХрд┐ рд╡реЗ рд╕реНрд╡рдпрдВ рддреБрд▓рдирд╛ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореАрдЯреНрд░рд┐рдХ рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛рдУрдВ рдХреЛ рдХреБрдВрдЬреА рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдЧрд▓реЗ рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╖рдп рд╣реИред