Polymorphy рдФрд░ рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рдХрдХреНрд╖рд╛рдПрдВ

рдирдорд╕реНрдХрд╛рд░ рдкреНрд░рд┐рдп рдкрд╛рдардХ!

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


рдмрд╣реБрд░реВрдкрддрд╛


рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ, рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд╣реБрд░реВрдкрддрд╛ рд╣реИрдВ - рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдХ рдФрд░ рд╡рд┐рд╢реЗрд╖ (рдЕрдВрдЧреНрд░реЗрдЬреА рдореЗрдВ рд╡реЗ "рддрджрд░реНрде" рд╢рдмреНрдж рдХрд╣рддреЗ рд╣реИрдВ, рдЬреЛ рд▓реИрдЯрд┐рди рднрд╛рд╖рд╛ рд╕реЗ рдЖрдпрд╛ рд╣реИ)ред

рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдХ


рдпрджрд┐ рдЖрдкрдиреЗ рдХрднреА рд╣рд╛рд╕реНрдХреЗрд▓ рднрд╛рд╖рд╛ рдХреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдЖрдк рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреА length, head, teal, curry, uncurry, map, filter, ... рдореЗрдВ рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдХ рдмрд╣реБрд░реВрдкрддрд╛ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ length, head, teal, curry, uncurry, map, filter, ... рдЗрди рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХреНрдпрд╛ рдПрдХрдЬреБрдЯ рдХрд░рддрд╛ рд╣реИ? рдЖрдЗрдП рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рджреЗрдЦреЗрдВ:
 length :: [a] -> Int length [] = [] length (_:xs) = 1 + length xs head :: [a] -> a head (x:_) = x tail :: [a] -> [a] tail (_:xs) = xs curry :: ((a,b) -> c) -> (a -> b -> c) curry fxy = f (x,y) uncurry :: (a -> b -> c) -> ((a,b) -> c) uncurry g (x,y) = gxy 


рдкрд╣рд▓реЗ рддреАрди рдлрд╝рдВрдХреНрд╢рдВрд╕ рдореЗрдВ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЗрдирдкреБрдЯ рдкреИрд░рд╛рдореАрдЯрд░ a , рдЬрдмрдХрд┐ curry рдФрд░ uncurry рдореЗрдВ b рдФрд░ c ред рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрдЬрд╛рдп ( Int, Bool, Char, ...), рдЯрд╛рдЗрдкрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬрд╛рд╡рд╛ рдЙрджрд╛рд╣рд░рдг:
 public class Test<A> {...} 


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

рд╣рд╛рд╕реНрдХреЗрд▓ рднрд╛рд╖рд╛ рдореЗрдВ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдЪрд░ рдХреЗ a, abc, aA101 рдЕрдХреНрд╖рд░ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП a, abc, aA101 ) рд╕реЗ рд╢реБрд░реВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рд╕рднреА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░ (рдирд┐рд░реНрдорд╛рддрд╛) рдПрдХ рдХреИрдкрд┐рдЯрд▓ рд▓реЗрдЯрд░ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП String, Int, Node ) рд╕реЗ рд╢реБрд░реВ рд╣реЛрддреЗ рд╣реИрдВред

рдкреИрд░рд╛рдореАрдЯрд░ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЛ рд▓реЗ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЗрдВрдЯ, рд╕реНрдЯреНрд░рд┐рдВрдЧ рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдлрд╝рдВрдХреНрд╢рди (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, length [f, g, h] , рдЬрд╣рд╛рдВ рдПрдл, рдЬреА, рдПрдЪ рдПрдХ рд╣реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдХрд╛рд░реНрдп рд╣реИрдВ)ред рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдЯрд╛рдЗрдк b рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХрд╛ рд▓реЗ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдкреНрд░рдХрд╛рд░ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИ a ред

GHCi рджреБрднрд╛рд╖рд┐рдпрд╛ (рдФрд░ рд╣рдЧ) рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╣рдореЗрд╢рд╛ рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ :t рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, :t :
 Main>:t length length :: [a] -> Int 


рд╡рд┐рд╢реЗрд╖ (рддрджрд░реНрде)


рд╡рд┐рд╢реЗрд╖ рдмрд╣реБрд░реВрдкрддрд╛ рдХрд╛ рдкрд░реНрдпрд╛рдпрд╡рд╛рдЪреА рд╢рдмреНрдж рд╣реИ "рдЕрддрд┐рднрд╛рд░рд┐рдд рдХрд╛рд░реНрдп"ред рдпрд╣ рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдХ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдПрдХ рдХрдордЬреЛрд░ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдмрд╣реБрд░реВрдкрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рд╕рдВрдЪрд╛рд▓рдХ (рдлрд╝рдВрдХреНрд╢рди) (+) рд▓реЗрдВред рдЗрд╕ рддрд░рд╣ рдХреА рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐
(+) 2 3 ->> 5
(+) 2.5 3.85 ->> 6.35
рднрд╛рд╡реЛрдВ рд╕реЗ рдЕрд▓рдЧ
(+) True False
(+) [1,2,3] [3,2,1]
рдЙрд╕ рдореЗрдВ, рдкрд╣рд▓реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рджреВрд╕рд░реЗ рдореЗрдВ, рдмреВрд▓ рдФрд░ [рдЗрдВрдЯ] рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдиред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдСрдкрд░реЗрдЯрд░ рдЧреИрд░-рд╕рдВрдЦреНрдпрд╛рддреНрдордХ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рд╣реИред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рдХрд╛рд░ рдХрд╛ рдирд╣реАрдВ рд╣реИ
(+) :: a -> a -> a
рдФрд░ рдРрд╕реЗ
(+) :: Num a => a -> a -> a ред рдпрд╣реА рд╣реИ, рдЗрдирдкреБрдЯ (рдФрд░ рдЖрдЙрдЯрдкреБрдЯ) рдбреЗрдЯрд╛ рдХреЗ рдкреНрд░рдХрд╛рд░ рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз рд╣реИред

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

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдмрд╛рдЗрдирд░реА рдЯреНрд░реА рдкреНрд░рдХрд╛рд░ рджрд┐рдП рдЧрдП рд╣реИрдВ:
рдПрдХ рдмрд╛рдЗрдирд░реА рдЯреНрд░реА рдЬреЛ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдбреЗрдЯрд╛ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ
 data Tree1 a = Nil | Node1 a (Tree1 a) (Tree1 a) 


рдПрдХ рджреНрд╡рд┐рдЖрдзрд╛рд░реА рдкреЗрдбрд╝ рдЬреЛ рджреЛ рддрддреНрд╡реЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рд╢рд╛рдЦрд╛ рдПрдХ рддрддреНрд╡ (рдФрд░ рдиреАрд▓ рдирд╣реАрдВ) рдХреЗ рд╕рд╛рде "рдкрддреНрддреА" рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрддреА рд╣реИ:
 data Tree2 ab = Leaf2 b | Node2 ab (Tree2 ab) (Tree2 ab) 


рдПрдХ рдмрд╛рдЗрдирд░реА рдЯреНрд░реА рдЬреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рдбреЗрдЯрд╛ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдПрдХ рд╢реАрдЯ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ:
 data Tree3 = Leaf3 String | Node3 String Tree3 Tree3 


рдФрд░, рдХрд╣рддреЗ рд╣реИрдВ, рд╕реВрдЪреА рдХреЗ рджреЛ рдФрд░ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ:
рд╕рд╛рдзрд╛рд░рдг
 type Lst a = [a] 

рдФрд░ "рд░рд╕реНрд╕реА" рдЯрд╛рдЗрдк рдХрд░реЗрдВ
 data Rope ab = Nil | Twisted b (Rope ba) 


рдЗрди рд╕рднреА рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рдмрд╛рдж, рдореИрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди size рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛, рдЬреЛ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛, рдпрд╛ рддреЛ рдЗрд╕рдХреА рдЧрд╣рд░рд╛рдИ (рдкреЗрдбрд╝реЛрдВ рдХреЗ рд▓рд┐рдП), рдпрд╛ рд▓рдВрдмрд╛рдИ (рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП), рдпрд╛ рдПрдХ рд╢рдмреНрдж - рдЖрдХрд╛рд░ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛ред рдПрдХ рднреЛрд▓рд╛ рд╕рдорд╛рдзрд╛рди рд╕рднреА рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╛рд░реЛрд╣ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛:
рдЫрд┐рдкрд╛ рд╣реБрдЖ рдкрд╛рда
 sizeT1 :: Tree1 a -> Int -- -  sizeT1 Nil = 0 sizeT1 (Node1 _ lr) = 1 + sizeT1 l + sizeT1 r sizeT2 :: (Tree2 ab) -> Int -- -  sizeT2 (Leaf 2 _) = 1 sizeT2 (Node2 _ _ lr) = 2 + sizeT2 l + sizeT2 r sizeT3 :: Tree3 -> Int --    String sizeT3 (Leaf3 m)= length m sizeT3 (Node mlr) = length m + sizeT3 l +sizeT3 r --   : sizeLst :: [a] -> Int sizeLst = length sizeRope :: (Rope ab) -> Int sizeRope Nil = 0 sizeRope (Twisted _ ls) = 1 + sizeRope ls 


рдЕрдм, рдпрджрд┐ рдХреЛрдИ рдЕрдиреНрдп рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдПрдХ рдирдпрд╛ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдХреЗрд╡рд▓ рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реЛрдЧрд╛ред рдФрд░ рд╣рдо рдХрд┐рд╕реА рднреА рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЖрдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдЪрд╛рд╣реЗрдВрдЧреЗред рдЪреВрдВрдХрд┐ рдлрд╝рдВрдХреНрд╢рди (+) рдореЗрдВ рдиреНрдпреВрдо рд╡рд░реНрдЧ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рдмрдВрдз рдерд╛, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЖрдХрд╛рд░ рд╡рд░реНрдЧ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рдмрдВрдз рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдЗрд╕реЗ рдкрд╣рд▓реЗ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
 class Size a where size :: a -> Int 


рдпрд╣ рдХреЗрд╡рд▓ (рд╡рд┐рд╢рд┐рд╖реНрдЯ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП) рдХреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╡рд░реНрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдг (рдЙрджрд╛рд╣рд░рдг) рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИ:
 instance Size (Tree1 a) where size Nil = 0 size (Node1 _ lr) = 1 + size l + size r instance Size (Tree2 ab) where size (Leaf2 _) = 1 size (Node2 _ _ lr) = 2 + size l + size r instance Size Tree3 where size (Leaf3 m) = length m size (Node3 mlr) = length m + size l + size r instance Size [a] where size = length instance Size (Rope ab) where size Nil = 0 size (Twisted _ ls) = 1 + size ls 


рд╣реЛ рдЧрдпрд╛! рдЕрдм рдЕрдЧрд░ рд╣рдо рд▓рд┐рдЦрддреЗ рд╣реИрдВ :t size рдЬреАрдПрдЪрд╕реАрдЖрдИ рдореЗрдВ :t size , рд╣рдо size :: Size a => a -> Int рджреЗрдЦреЗрдВрдЧреЗ size :: Size a => a -> Int ред рд╣рдореЗрдВ рд╡рд╣ рдорд┐рд▓рд╛ рдЬреЛ рд╣рдо рдЪрд╛рд╣рддреЗ рдереЗ:
 size Nil ->> 0 size (Node1 "foo" (Node1 "bar" Nil Nil) Nil) ->> 2 size (Leaf 2 "foo") ->> 1 size (Node3 "foo" (Node3 "bar" (Leaf3 "abc") (Leaf "cba")) (Leaf "tst")) ->> 15 --3*5 size [1..5] ->> 5 size (Rope 2 (Rope 'a' (Rope 5 Nil))) ->> 3 


Size рд╡рд░реНрдЧ рдХрд╛ рдкреНрд░рддреНрдпреЗрдХ рдЙрджрд╛рд╣рд░рдг рдЖрдХрд╛рд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдХреЗрд╡рд▓ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдкреНрд░рдХрд╛рд░ (= рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ) рдХреЗ рдореВрд▓реНрдпреЛрдВ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдлрд╝рдВрдХреНрд╢рди, рд╕рд╛рде рд╣реА рд╕рд╛рде рдЕрдиреНрдп рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдСрдкрд░реЗрдЯрд░ (+), (*), (-), рдЕрддрд┐рднрд╛рд░рд┐рдд рд╣реИред

рд▓реЗрдХрд┐рди рдЗрд╕ рддрд░рд╣ рдХреЗ рдирд┐рд░реНрдгрдп рдХреЗ рдиреБрдХрд╕рд╛рди рднреА рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдпреБрдЧреНрдорд┐рдд рд╕реВрдЪреА рдореЗрдВ рддрддреНрд╡реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреНред
 size [(1,2), (3,4)] ->> 4 size [('a','b'), ('c','d'), ('e','f')] ->> 6 

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдп рдХрд░рдирд╛ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдЧрд╛:
 instance Size [(a,b)] where size = (*2) . length 


рд▓реЗрдХрд┐рди рдпрд╣рд╛рдБ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рд╛рдорд╛рдиреНрдп рд╕реВрдЪреА рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ ( instance Size [a] where ), рд╣рдо рдЕрдм рдПрдХ рдЕрд▓рдЧ рдкрд░рд┐рднрд╛рд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐, рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдкреНрд░рдХрд╛рд░ a рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд╕рд╣рд┐рдд (b,c) , рд╡рд╣ рд╣реИред [a] == [(b,c)] рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдУрд╡рд░рд▓реИрдкрд┐рдВрдЧ рдЗрдВрд╕реНрдЯреЗрдВрд╕ (рдЕрдВрдЧреНрд░реЗрдЬреА рдУрд╡рд░рд▓реИрдкрд┐рдВрдЧ рдХреНрд▓рд╛рд╕ рдЗрдВрд╕реНрдЯреЗрдВрд╕реЗрд╕) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдореЗрдВ рдЗрд╕рдХреА рдХрдорд┐рдпрд╛рдВ рд╣реИрдВ (рдХрд┐рд╕реА рдПрдХ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдЖрдпрд╛рдд рдХрд░рдиреЗ рд╕реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдореВрд▓реНрдп рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ, рднреНрд░рд╛рдордХ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ, рдФрд░ рдЗрд╕реА рддрд░рд╣)ред
рдЕрдм рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рдФрд░ред

рдХрдХреНрд╖рд╛рдПрдВ


рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдордиреЗ Size рд╡рд░реНрдЧ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдБ рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рдЕрдкреВрд░реНрдг рд╡рд░реНрдЧ рдШреЛрд╖рдгрд╛ рд╣реИ: (рдЯреАрд╡реА = рдкреНрд░рдХрд╛рд░ рдЪрд░):
 class Name tv where    tv 


рдЕрдзреВрд░рд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ tv рдкрд░ рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреЛ рд╡рд░реНрдЧ рдШреЛрд╖рдгрд╛ рдореЗрдВ рднреА рдкреЗрд╢ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, tv рдХреЛ Ord рдХреНрд▓рд╛рд╕ рдХрд╛ рдПрдХ рддрддреНрд╡ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП)ред рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдЖрдкрдХреЛ рдЬрд┐рддрдиреЗ рдкрд╕рдВрдж рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЛ рдЪрд░ рдЯреАрд╡реА рдХреЗ рд░реВрдк рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП (рдЗрдирдкреБрдЯ рдФрд░ / рдпрд╛ рдЖрдЙрдЯрдкреБрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ)ред
рдЯрд╛рдЗрдк рдХрдХреНрд╖рд╛рдПрдВ рдЙрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рд╕рдВрдЧреНрд░рд╣ рд╣реИ рдЬрд┐рдирдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рдХрд╛рд░реНрдп рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВред рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рдХреБрдЫ (рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг) рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИрдВ:


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


рдЖрдЗрдП рд╕рдорддреБрд▓реНрдпрддрд╛ Eq рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рджреЗрдЦреЗрдВред рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕ рд╡рд░реНрдЧ рдореЗрдВ рджреЛ рдХрд╛рд░реНрдп (==) рдФрд░ (/ =) рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП:
 class Eq a where (==), (/=) :: a -> a -> Bool --   (==)  (/=) ,     1  x /= y = not (x == y) x == y = not (x /= y) 


рдХреЛрдб рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ Eq рд╡рд░реНрдЧ рдХреЗ рдХрд┐рд╕реА рднреА рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рджреЛ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдмреВрд▓ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП (рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗрд╡рд▓ рддрдм рд╣реА рд╕рдорд╛рди рд╣реЛрддреЗ рд╣реИрдВ, рдЬрдм рд╡реЗ рджреЛрдиреЛрдВ рд╕рд╣реА рдпрд╛ рдЧрд▓рдд рд╣реЛрддреЗ рд╣реИрдВ) рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
 instance Eq Bool where (==) True True = True (==) False False = True (==) _ _ = False 


рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдХреЗрд╕ рдЯреНрд░реВ рдлрд╝рд▓реНрд╕ рдПрдВрдб рдлрд╝рд▓реНрд╕ рдЯреНрд░реВ (рд╕рд╛рде рд╣реА рдЕрдВрддрд┐рдо рдкрдВрдХреНрддрд┐) рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрд╕рдорд╛рдирддрд╛ рд╕рдорд╛рдирддрд╛ рдХрд╛ рд╡рд┐рд▓реЛрдо рд╣реИред рдпрджрд┐ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдпрд╣ рдорд╛рдорд▓рд╛ рдерд╛ рдХрд┐ рдкреНрд░рдХрд╛рд░ рджреВрд╕рд░реЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ cokretization рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, [Int] рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИ [a]), рдЕрдм рдкреНрд░рдХрд╛рд░ рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Bool Eq рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ)ред рдЙрд╕реА рд╕рд╛рджреГрд╢реНрдп рд╕реЗ, рд╣рдо рдЙрди рдмрд╛рдЗрдирд░реА рдкреЗрдбрд╝реЛрдВ рдХреЗ рд╕рдорд╛рдирддрд╛ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╣рдордиреЗ рдКрдкрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдереЗред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЯреНрд░реА 2 рдХреЗ рд▓рд┐рдП:
 instance (Eq a) => Eq (Tree2 a) where --   a,      (==) (Leaf2 s) (Leaf2 t) = (s==t) (==) (Node2 s t1 t2) (Node2 t u1 u2)= (s==t) && (t1 == u1) && (t2 == u2) (==) _ _ = False 

(Tree3 ab) рд╣рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА a рдФрд░ b рджреЛрдиреЛрдВ рдкрд░ рдПрдХ рд╢рд░реНрдд рд▓рд╛рдЧреВ рдХрд░рдиреА рд╣реЛрдЧреА, рдЕрд░реНрдерд╛рддреНред
instance (Eq a, Eq b) => Eq (Tree3 ab)

рдкреНрд░рддреАрдХ рдХреЗ рдмрд╛рдИрдВ рдУрд░ рдХрд╛ рд╕рдм рдХреБрдЫ => рдПрдХ рд╕рдВрджрд░реНрдн рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕ рдкреНрд░рддреАрдХ рдХреЗ рджрд╛рдИрдВ рдУрд░ рд╕рдм рдХреБрдЫ рдпрд╛ рддреЛ рдЖрдзрд╛рд░ рдкреНрд░рдХрд╛рд░ (рдЗрдВрдЯ, рдмреВрд▓, ...) рдпрд╛ рдЯрд╛рдЗрдк рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ (рдЯреНрд░реА рдП, [...], ...) рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдСрдкрд░реЗрдЯрд░ (==) рдПрдХ рдЕрддрд┐рднрд╛рд░рд┐рдд рдлрд╝рдВрдХреНрд╢рди (рддрджрд░реНрде рдмрд╣реБрд░реВрдкрддрд╛) рд╣реИред

рд╕рдорд╛рдирддрд╛ (==) рдПрдХ рдкреНрд░рдХрд╛рд░ рдкрд░ рдирд┐рд░реНрднрд░ рд╕рдВрдкрддреНрддрд┐ рд╣реИ рдЬрд┐рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ (рдЬреИрд╕реЗ рдХрд┐ рдмрд╛рдЗрдирд░реА рдкреЗрдбрд╝реЛрдВ рдХреА рд╕рдорд╛рдирддрд╛ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди)ред рдореИрдВ рдЗрд╕ рддрд░рд╣ рд╕реЗ рджреЛ рдХрд╛рд░реНрдпреЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛:
 (==) fac fib ->> False -- fac -  ,  fib -   (==) (\x -> x+x) (\x -> 2*x) ->> True (==) (+2) (2+) ->> True 

рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рдРрд╕рд╛ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:
 instace Eq (Int -> Int) where (==) fg = ... -- f  g  -  


рдХреНрдпрд╛ рдРрд╕рд╛ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрдирд╛ рд╕рдВрднрд╡ рд╣реИ рдЬреЛ рдХрд┐рд╕реА рднреА рджреЛ рдХрд╛рд░реНрдпреЛрдВ (рд╕рдЪ рдпрд╛ рдЧрд▓рдд) рдХреА рд╕рдорд╛рдирддрд╛ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рджреЗрдЧрд╛? рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЪрд░реНрдЪ-рдЯреНрдпреВрд░рд┐рдВрдЧ рдереАрд╕рд┐рд╕ рд╕реЗ рдпрд╣ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рднреА рджреЛ рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╕рдорд╛рдирддрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдирд╣реАрдВ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред рдХреЛрдИ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдирд╣реАрдВ рд╣реИ, рдЬреЛ рдХрд┐рд╕реА рднреА рджреЛ рджрд┐рдП рдЧрдП рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрд╢рд╛ рдФрд░ рдЪрд░рдгреЛрдВ рдХреА рдПрдХ рд╕реАрдорд┐рдд рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рдпрд╣ рддрдп рдХрд░рддрд╛ рд╣реИ рдХрд┐ рджреЛрдиреЛрдВ рдХрд╛рд░реНрдп рд╕рдорд╛рди рд╣реИрдВ рдпрд╛ рдирд╣реАрдВред рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рдХрд┐рд╕реА рднреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╕рдорд╛рдирддрд╛ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдХрд╛рд░реНрдп рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рджреНрд╡рд┐рдЖрдзрд╛рд░реА рдкреЗрдбрд╝, рдЖрдк рд╣рдореЗрд╢рд╛ рдЙрди рд╡рд░реНрдЧреЛрдВ рдХреЛ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ deriving рдХреАрд╡рд░реНрдб рдХреЗ рдмрд╛рдж рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реЗ рд╣реИрдВред рдЕрд░реНрдерд╛рддреН, рд╣рдо рдХрд╛рдлреА рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ:
 data Tree a = Nil | Node a (Tree a) (Tree a) deriving Eq 


рдпрд╣ рд╣рдореЗрдВ рдЕрдкрдиреЗ рд╣рд╛рдереЛрдВ рд╕реЗ Eq рд╡рд░реНрдЧ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ ( instance Eq a => Eq (Tree a) where ... )ред рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рднреА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП, рдлрд┐рд░ рдЪрд░ рдкрд░ рдПрдХ рд╢рд░реНрдд рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ a рдХрд┐ рдпрд╣ рдЪрд░ рд╡рд░реНрдЧ рдИрдХ рдХрд╛ рдПрдХ рддрддреНрд╡ рд╣реИред рдХрднреА-рдХрднреА, рдЖрдЦрд┐рд░рдХрд╛рд░, рдЖрдкрдХреЛ рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕реНрд╡рдпрдВ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ "рд╕реНрд╡рдЪрд╛рд▓рд┐рдд" рддреБрд▓рдирд╛ рд╣рдореЗрд╢рд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреА рд╣реИ рдЬреИрд╕рд╛ рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╛рдЗрдирд░реА рдЯреНрд░реА рдХреЗ рд▓рд┐рдП
 data Tree3 ab = Leaf3 bl | Node3 ab (Tree3 ab) (Tree3 ab) deriving Eq 

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:
 instance (Eq a, Eq b) => Eq (Tree3 ab) where (==) (Leaf3 q) (Leaf3 s) = (q==s) (==) (Node3 _ q t1 t2) (Node3 _ s u1 u2) = (q==s)&&(t1==u1)&&(t2==u2) (==) _ _ = False 

рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, Node3 рдХрд╛ рдкрд╣рд▓рд╛ рддрд░реНрдХ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд┐рд╕реЗ рд╣рдо рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдирд╣реАрдВ рдЪрд╛рд╣реЗрдВрдЧреЗред

рдирд┐рд╖реНрдХрд░реНрд╖


рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд╣реБрд░реВрдкрддрд╛ рдХреЗ рдмреАрдЪ рдПрдХ рдЕрдиреМрдкрдЪрд╛рд░рд┐рдХ рдЕрдВрддрд░:

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


All Articles