module Demo where




-- Eq - ýòî èìÿ êëàññà òèïîâ.
-- a - ýòî òèïîâîé ïàðàìåòð, êîòîðûé ïàðàìåòðèçóåò ýòîò êëàññ òèïîâ.
class Eq a where
-- Äàëüøå èäóò ïåðå÷èñëåíèÿ ñèãíàòóð ôóíêöèé. Îíè äîëæíû îáÿçàòåëüíî íà÷èíàòüñÿ ñ íåíóëåâîãî îòñòóïà.
-- Çäåñü íå çàäàþòñÿ ðåàëèçàöèè, à ïðèñóòñòâóåò òîëüêî èíòåðôåéñ.
-- Â ñëó÷àåò ñïåöèàëüíîãî ïîëèìîðôèçìà äîëæíà áûòü ñâîÿ ðåàëèçàöèÿ äëÿ êàæäîãî êîíêðåòíîãî òèïà, êîòîðûé áóäåò ïîäñòàâëåí â ìåñòå a.
 (==) :: a -> a -> Bool -- ôóíêöèÿ ñðàâíåíèÿ íà ðàâåíñòâî ýëåìåíòîâ òèïà a
 (/=) :: a -> a -> Bool -- ôóíêöèÿ ñðàâíåíèÿ íà íåðàâåíñòâî
{- èëè
 (==), (/=) :: a -> a -> Bool
-}
 x /= y = not (x == y) -- ðåàëèçàöèÿ ïî óìîë÷àíèþ
 x == y = not (x /= y) 




-- Îáúÿâëåíèå ïðåäñòàâèòåëÿ êëàññà òèïîâ.
instance Eq Bool where
 True  == True  = True
 False == False = True
 _     == _     = False
-- x /= y       = not (x == y)




-- Ïîëèìîðôíûå îãðàíè÷åíèÿ ïîÿâëÿþòñÿ â âèäå êîíòåêñòà.
instance (Eq a, Eq b) => Eq (a, b) where
 p1 == p2 = fst p1 == fst p2 && snd p1 == snd p2

-- Ñïèñêè ìîãóò ñðàâíèâàòüñÿ íà ðàâåíñòâî, åñëè èõ ýëåìåíòû ñðàâíèìû íà ðàâåíñòâî.
-- instance Eq a => Eq [a] where
-- ðåàëèçàöèÿ
-- ñïèñêè ðàâíû, êîãäà ðàâíû èõ äëèíû è îíè ñîâïàäàþò ïîýëåìåíòíî




{- 
Êëàññ òèïîâ Ord ïàðàìåòðèçîâàí òèïîâûì ïàðàìåòðîì a è èìååò â ðàìêàõ êëàññà òèïîâ êîíòåêñò.
Êëàññ òèïîâ Ord ðàñøèðÿåò êëàññ òèïîâ Eq.
-}
class (Eq a) => Ord a where
 (<), (<=), (>=), (>) :: a -> a -> Bool -- ñèãíàòóðû ôóíêöèé ñðàâíåíèÿ
 max, min :: a -> a -> a
 compare :: a -> a -> Ordering -- áîëåå òùàòåëüíîå ñðàâíåíèå äâóõ çíà÷åíèé
{- Minimal complete definition: either compare or <= -}




{-
Êëàññ òèïîâ MyClass ÿâëÿåòñÿ ðàñøèðåíèåì êëàññîâ òèïîâ Eq è Printable.
-}
class (Eq a, Printable a) => MyClass a where
-- ...