рдирдорд╕реНрдХрд╛рд░ рдкреНрд░рд┐рдп рдкрд╛рдардХ!
рдЖрдЬ рд╣рдо рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдмрд╣реБрд░реВрдкрддрд╛ рдФрд░ рд╣рд╛рд╕реНрдХреЗрд▓ рднрд╛рд╖рд╛ рдореЗрдВ рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗ, рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ рдФрд░ рдЙрдирдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕рднреА рдиреЗ рдЬрд╛рд╡рд╛ рднрд╛рд╖рд╛ рдореЗрдВ рдмрд╣реБрд░реВрдкрддрд╛ рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рдЗрд╕реЗ рд╣рд╛рд╕реНрдХреЗрд▓ рдкрд░ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ? рд╣рд╛рд╕реНрдХреЗрд▓ рдПрдХ рд╡рд╕реНрддреБ-рдЙрдиреНрдореБрдЦ рднрд╛рд╖рд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рдЕрднреА рднреА рдХрдХреНрд╖рд╛рдПрдВ рд╣реИрдВред рдпрджреНрдпрдкрд┐ рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рдСрдмреНрдЬреЗрдХреНрдЯ-рдУрд░рд┐рдПрдВрдЯреЗрдб рднрд╛рд╖рд╛рдУрдВ рдХреЗ рд╡рд░реНрдЧреЛрдВ рдХреЗ рдХреБрдЫ рдЧреБрдг рд╣реИрдВ, рд╡реЗ рдЗрд╕рд╕реЗ рдЕрдзрд┐рдХ рдЕрдореВрд░реНрдд рд╣реИрдВ рдФрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╣реИрдВред рдЬрд╛рд╡рд╛ рднрд╛рд╖рд╛ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рджреГрд╢реНрдп рдХреЛ рдЖрдЧреЗ рдмрдврд╝рд╛рддреЗ рд╣реБрдП, рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рдХрдХреНрд╖рд╛рдПрдВ рдЗрдВрдЯрд░рдлреЗрд╕ рд╕реЗ рдЬреНрдпрд╛рджрд╛ рдХреБрдЫ рдирд╣реАрдВ рд╣реИрдВ - рдХреЗрд╡рд▓ рдлрд╝рдВрдХреНрд╢рди рдШреЛрд╖рдгрд╛рдУрдВ рдХреЛ рдХрдХреНрд╖рд╛ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрд╛рдж рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдореИрдВ рд▓реЗрдЦ рдореЗрдВ рд╕рднреА рдХрдорд┐рдпреЛрдВ рдФрд░ рдЕрд╢реБрджреНрдзрд┐рдпреЛрдВ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рд╕рд╛рде рд╣реА рд╕рд╛рде рдЕрдЪреНрдЫреА рд╕рд▓рд╛рд╣ рдФрд░ рд▓реЗрдЦрди рдореЗрдВ рдорджрдж рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛
рдбрд╛рд░реНрдХрд╕ рдХреЛ рдзрдиреНрдпрд╡рд╛рдж рджреЗрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред
рдмрд╣реБрд░реВрдкрддрд╛
рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ, рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд╣реБрд░реВрдкрддрд╛ рд╣реИрдВ - рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдХ рдФрд░ рд╡рд┐рд╢реЗрд╖ (рдЕрдВрдЧреНрд░реЗрдЬреА рдореЗрдВ рд╡реЗ "рддрджрд░реНрде" рд╢рдмреНрдж рдХрд╣рддреЗ рд╣реИрдВ, рдЬреЛ рд▓реИрдЯрд┐рди рднрд╛рд╖рд╛ рд╕реЗ рдЖрдпрд╛ рд╣реИ)ред
рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдХ
рдпрджрд┐ рдЖрдкрдиреЗ рдХрднреА рд╣рд╛рд╕реНрдХреЗрд▓ рднрд╛рд╖рд╛ рдХреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдЖрдк рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреА
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
рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛, рдЬреЛ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛, рдпрд╛ рддреЛ рдЗрд╕рдХреА рдЧрд╣рд░рд╛рдИ (рдкреЗрдбрд╝реЛрдВ рдХреЗ рд▓рд┐рдП), рдпрд╛ рд▓рдВрдмрд╛рдИ (рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП), рдпрд╛ рдПрдХ рд╢рдмреНрдж - рдЖрдХрд╛рд░ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛ред рдПрдХ рднреЛрд▓рд╛ рд╕рдорд╛рдзрд╛рди рд╕рднреА рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╛рд░реЛрд╣ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛:
рдЫрд┐рдкрд╛ рд╣реБрдЖ рдкрд╛рда рдЕрдм, рдпрджрд┐ рдХреЛрдИ рдЕрдиреНрдп рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдПрдХ рдирдпрд╛ рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ
рдХреЗрд╡рд▓ рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реЛрдЧрд╛ред рдФрд░ рд╣рдо
рдХрд┐рд╕реА рднреА рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЖрдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдЪрд╛рд╣реЗрдВрдЧреЗред рдЪреВрдВрдХрд┐ рдлрд╝рдВрдХреНрд╢рди (+) рдореЗрдВ рдиреНрдпреВрдо рд╡рд░реНрдЧ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рдмрдВрдз рдерд╛, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЖрдХрд╛рд░ рд╡рд░реНрдЧ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рдмрдВрдз рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдЗрд╕реЗ рдкрд╣рд▓реЗ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
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
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
рдХреНрд▓рд╛рд╕ рдХрд╛ рдПрдХ рддрддреНрд╡ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП)ред рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдЖрдкрдХреЛ рдЬрд┐рддрдиреЗ рдкрд╕рдВрдж рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЛ рдЪрд░ рдЯреАрд╡реА рдХреЗ рд░реВрдк рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП (рдЗрдирдкреБрдЯ рдФрд░ / рдпрд╛ рдЖрдЙрдЯрдкреБрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ)ред
рдЯрд╛рдЗрдк рдХрдХреНрд╖рд╛рдПрдВ рдЙрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рд╕рдВрдЧреНрд░рд╣ рд╣реИ рдЬрд┐рдирдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рдХрд╛рд░реНрдп рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВред рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рдХреБрдЫ (рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг) рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИрдВ:
- Eq - рджреЛ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ (рд╕рдВрдЪрд╛рд▓рди ==, / =) рдХреА рд╕рдорд╛рдирддрд╛ (рдЕрд╕рдорд╛рдирддрд╛) рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рд╡рд░реНрдЧ
- рдЖрдпреБ - рдкреНрд░рдХрд╛рд░ рдХреЗ рдХреНрд░рдо рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд░реНрдЧ, рдЬреЛ рдХрд┐ рддрддреНрд╡ рдмрдбрд╝рд╛ рд╣реИ, рдЬреЛ рдЫреЛрдЯрд╛ рд╣реИ (рд╕рдВрдЪрд╛рд▓рди>,> =, <, <=, рдиреНрдпреВрдирддрдо, рдЕрдзрд┐рдХрддрдо ...)
- Enum - рдЙрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд░реНрдЧ рдЬрд┐рд╕рдХрд╛ рдорд╛рди "рдЧрд┐рдирд╛" рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, [1..10])
- рдмрдВрдзреЗ - рдмрдВрдзреЗ рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ Enum рд╡рд░реНрдЧ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рднреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд┐рдЪрд▓реЗ рдФрд░ рдКрдкрд░реА рд╕реАрдорд╛ рдХрд╛ рдирд╛рдо рджрд┐рдпрд╛ рдЧрдпрд╛ред
- рджрд┐рдЦрд╛рдПрдБ - рдЙрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд░реНрдЧ рдЬрд┐рдирдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (= рд╡рд░реНрдгреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)
- рдкрдврд╝реЗрдВ - рдЙрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд░реНрдЧ рдЬрд┐рдирдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕реЗ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
рдХреЗрд╡рд▓ рдЗрди рд╡рд░реНрдЧреЛрдВ рдХреЛ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдбреЗрдЯрд╛ рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (=
deriving
рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ)ред рд╡рд░реНрдЧреЛрдВ рдХреЗ рдмреАрдЪ рдирд┐рд░реНрднрд░рддрд╛ рднреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рджреЛ рддрддреНрд╡реЛрдВ (рд╡рд░реНрдЧ рдСрд░реНрдб) рдХреА рддреБрд▓рдирд╛ рдХреИрд╕реЗ рдХреА рдЬрд╛рддреА рд╣реИ, рддреЛ рд╣рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреНрдпрд╛ рдПрдХ рддрддреНрд╡ рджреВрд╕рд░реЗ (рдХреНрд▓рд╛рд╕ рдИрдХ) рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред рджрд░рдЕрд╕рд▓, рдСрдкрд░реЗрдЯрд░ (
>=
) рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдСрдкрд░реЗрдЯрд░ (==) рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдпрд╣ рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╡рд░реНрдЧ рдСрд░реНрдб рд╡рд░реНрдЧ рд╕реЗ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ (рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ)ред рдпрд╣рд╛рдБ рд╡рд░реНрдЧ рдирд┐рд░реНрднрд░рддрд╛ рдХрд╛ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рдЖрд░реЗрдЦ рд╣реИ:

рдЖрдЗрдП рд╕рдорддреБрд▓реНрдпрддрд╛
Eq
рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рджреЗрдЦреЗрдВред рдЬреИрд╕рд╛ рдХрд┐ рдкрд╣рд▓реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕ рд╡рд░реНрдЧ рдореЗрдВ рджреЛ рдХрд╛рд░реНрдп (==) рдФрд░ (/ =) рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП:
class Eq a where (==), (/=) :: a -> a -> Bool
рдХреЛрдб рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ 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
(Tree3 ab)
рд╣рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА
a
рдФрд░
b
рджреЛрдиреЛрдВ рдкрд░ рдПрдХ рд╢рд░реНрдд рд▓рд╛рдЧреВ рдХрд░рдиреА рд╣реЛрдЧреА, рдЕрд░реНрдерд╛рддреНред
instance (Eq a, Eq b) => Eq (Tree3 ab)
рдкреНрд░рддреАрдХ рдХреЗ рдмрд╛рдИрдВ рдУрд░ рдХрд╛ рд╕рдм рдХреБрдЫ
=>
рдПрдХ рд╕рдВрджрд░реНрдн рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕ рдкреНрд░рддреАрдХ рдХреЗ рджрд╛рдИрдВ рдУрд░ рд╕рдм рдХреБрдЫ рдпрд╛ рддреЛ рдЖрдзрд╛рд░ рдкреНрд░рдХрд╛рд░ (рдЗрдВрдЯ, рдмреВрд▓, ...) рдпрд╛ рдЯрд╛рдЗрдк рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ (рдЯреНрд░реА рдП, [...], ...) рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдСрдкрд░реЗрдЯрд░ (==) рдПрдХ рдЕрддрд┐рднрд╛рд░рд┐рдд рдлрд╝рдВрдХреНрд╢рди (рддрджрд░реНрде рдмрд╣реБрд░реВрдкрддрд╛) рд╣реИред
рд╕рдорд╛рдирддрд╛ (==) рдПрдХ рдкреНрд░рдХрд╛рд░ рдкрд░ рдирд┐рд░реНрднрд░ рд╕рдВрдкрддреНрддрд┐ рд╣реИ рдЬрд┐рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ (рдЬреИрд╕реЗ рдХрд┐ рдмрд╛рдЗрдирд░реА рдкреЗрдбрд╝реЛрдВ рдХреА рд╕рдорд╛рдирддрд╛ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди)ред рдореИрдВ рдЗрд╕ рддрд░рд╣ рд╕реЗ рджреЛ рдХрд╛рд░реНрдпреЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛:
(==) fac fib ->> False
рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рд╛рд╕реНрдХреЗрд▓ рдореЗрдВ рдРрд╕рд╛ рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:
instace Eq (Int -> Int) where (==) fg = ...
рдХреНрдпрд╛ рдРрд╕рд╛ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрдирд╛ рд╕рдВрднрд╡ рд╣реИ рдЬреЛ
рдХрд┐рд╕реА рднреА рджреЛ рдХрд╛рд░реНрдпреЛрдВ (рд╕рдЪ рдпрд╛ рдЧрд▓рдд) рдХреА рд╕рдорд╛рдирддрд╛ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рджреЗрдЧрд╛? рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЪрд░реНрдЪ-рдЯреНрдпреВрд░рд┐рдВрдЧ рдереАрд╕рд┐рд╕ рд╕реЗ рдпрд╣ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рднреА рджреЛ рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╕рдорд╛рдирддрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдирд╣реАрдВ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред рдХреЛрдИ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдирд╣реАрдВ рд╣реИ, рдЬреЛ рдХрд┐рд╕реА рднреА рджреЛ рджрд┐рдП рдЧрдП рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрд╢рд╛ рдФрд░ рдЪрд░рдгреЛрдВ рдХреА рдПрдХ рд╕реАрдорд┐рдд рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рдпрд╣ рддрдп рдХрд░рддрд╛ рд╣реИ рдХрд┐ рджреЛрдиреЛрдВ рдХрд╛рд░реНрдп рд╕рдорд╛рди рд╣реИрдВ рдпрд╛ рдирд╣реАрдВред рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рдХрд┐рд╕реА рднреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╕рдорд╛рдирддрд╛ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдХрд╛рд░реНрдп рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рджреНрд╡рд┐рдЖрдзрд╛рд░реА рдкреЗрдбрд╝, рдЖрдк рд╣рдореЗрд╢рд╛ рдЙрди рд╡рд░реНрдЧреЛрдВ рдХреЛ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ
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 рдХрд╛ рдкрд╣рд▓рд╛ рддрд░реНрдХ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд┐рд╕реЗ рд╣рдо рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдирд╣реАрдВ рдЪрд╛рд╣реЗрдВрдЧреЗред
рдирд┐рд╖реНрдХрд░реНрд╖
рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд╣реБрд░реВрдкрддрд╛ рдХреЗ рдмреАрдЪ рдПрдХ рдЕрдиреМрдкрдЪрд╛рд░рд┐рдХ рдЕрдВрддрд░:
- рдкреИрд░рд╛рдореАрдЯреНрд░рд┐рдХ - рд╕рдорд╛рди рдкреНрд░рдХрд╛рд░ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ рд╕рдорд╛рди рдХреЛрдбред
- рддрджрд░реНрде - рд╡рд┐рднрд┐рдиреНрди рдХреЛрдб, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдПрдХ рд╣реА рдлрд╝рдВрдХреНрд╢рди рдирд╛рдоред