-- 5. cvičení import Data.List -- vlastní datový typ data Barva = Zelena | Cervena | Modra | Kombinace Barva Barva -- tento datový typ je rekurzivní, příklady honot: -- Zelena -- Kombinace Zelena Modra -- Kombinace Zelena (Kombinace Cervena Modra) -- ... jeZelena :: Barva -> Bool jeZelena Zelena = True jeZelena _ = False -- typové třídy instance Show Barva where show Zelena = "Zelena" show Cervena = "Cervena" show Modra = "Modra" show (Kombinace a b) = "Kombinace (" ++ show a ++ ") (" ++ show b ++ ")" -- vlastní datové typy data Teleso = Kvadr Double Double Double -- a,b,c | Valec Double Double -- r,v | Kuzel Double Double -- r,v | Koule Double -- r deriving ( Show, Read ) instance Eq Teleso where -- (Kvadr a b c) == (Kvadr d e f) = a == d && b == e && c == f (Kvadr a b c) == (Kvadr d e f) = sort [a, b, c] == sort [d,e,f] (Valec r1 v1) == (Valec r2 v2) = r1 == r2 && v1 == v2 (Kuzel r1 v1) == (Kuzel r2 v2) = r1 == r2 && v1 == v2 (Koule r1) == (Koule r2) = r1 == r2 _ == _ = False objem :: Teleso -> Double objem (Kvadr a b c) = a * b * c objem (Valec r v) = pi * r^2 * v objem (Kuzel r v) = 1/3 * objem (Valec r v) objem (Koule r) = 4/3 * pi * r^3 data Dvojice a b = Dvojice a b deriving ( Show, Read, Eq ) -- instance (Show a, Show b) => Show (Dvojice a b) where ... -- instance (Eq a, Eq b) => Eq (Dvojice a b) where ... -- instance (Ord a, Ord b) => Ord (Dvojice a b) where -- (Dvojice x y) <= (Dvojice a b) = ... query :: String -> IO Bool query otazka = do putStrLn otazka odpoved <- getLine if odpoved `elem` [ "ano", "áno" ] then return True else if odpoved `elem` [ "ne", "nie" ] then return False else query otazka