-- Practicum 5 -- Joris Bontje -- Opgave 12.8 blz 219 (236) ---------------------------- -- commented so it won't conflict with existing code --instance (Ord a, Ord b) => Ord (a,b) where -- compare (a1, b1) (a2, b2) -- | compare a1 a2 == EQ = compare b1 b2 -- | otherwise = compare a1 a2 --instance Ord b => Ord [b] where -- compare [] (_:_) = LT -- compare [] [] = EQ -- compare (_:_) [] = GT -- compare (x:xs) (y:ys) -- | compare x y == EQ = compare xs ys -- | otherwise = compare x y -- Opgave 14.16 ---------------------------- -- commented so it doesn't conflict with 14.17 --data Expr = Lit Int | -- Add Expr Expr | -- Sub Expr Expr --size :: Expr -> Int --size (Lit n) = 0 --size (Add e1 e2) = 1 + size e1 + size e2 --size (Sub e1 e2) = 1 + size e1 + size e2 -- Opgave 14.17 ---------------------------- data Expr = Lit Int | Add Expr Expr | Sub Expr Expr | Mul Expr Expr | Div Expr Expr eval :: Expr -> Int eval (Lit n) = n eval (Add e1 e2) = (eval e1) + (eval e2) eval (Sub e1 e2) = (eval e1) - (eval e2) eval (Mul e1 e2) = (eval e1) * (eval e2) eval (Div e1 e2) = (eval e1) `div` (eval e2) -- show :: Expr -> String instance Show Expr where show (Lit n) = show n show (Add e1 e2) = "(" ++ show e1 ++ "+" ++ show e2 ++ ")" show (Sub e1 e2) = "(" ++ show e1 ++ "-" ++ show e2 ++ ")" show (Mul e1 e2) = "(" ++ show e1 ++ "*" ++ show e2 ++ ")" show (Div e1 e2) = "(" ++ show e1 ++ "/" ++ show e2 ++ ")" size :: Expr -> Int size (Lit n) = 0 size (Add e1 e2) = 1 + size e1 + size e2 size (Sub e1 e2) = 1 + size e1 + size e2 size (Mul e1 e2) = 1 + size e1 + size e2 size (Div e1 e2) = 1 + size e1 + size e2 -- bij een deeling door nul krijg je de volgende error: -- Program error: divide by zero -- Opgave 14.X -- voorbeeld data: mobiel1 = (Arm 3 (Arm 4 (Gewicht 2) 2 (Gewicht 4)) 6 (Gewicht 3)) mobiel2 = (Arm 1 (Arm 3 (Arm 1 (Gewicht 2) 2 (Gewicht 1)) 2 (Gewicht 5)) 4 (Gewicht 2)) -- a) data Mobiel = Arm Int Mobiel Int Mobiel | Gewicht Int -- b) gewicht :: Mobiel -> Int gewicht (Gewicht n) = n gewicht (Arm al ml ar mr) = gewicht ml + gewicht mr -- c) inEvenwicht :: Mobiel -> Bool inEvenwicht (Gewicht n) = True inEvenwicht (Arm al ml ar mr) = al * gewicht ml == ar * gewicht mr -- d) instance Show Mobiel where show (Gewicht n) = "(" ++ (show n) ++ ")" show (Arm al ml ar mr) = "[" ++ (show ml) ++ "]--" ++ (show al) ++ "--|--" ++ (show ar) ++ "--[" ++ (show mr) ++ "]" instance Eq Mobiel where (Gewicht n1) == (Gewicht n2) = n1 == n2 (Gewicht n) == (Arm al ml ar mr) = False (Arm al ml ar mr) == (Gewicht n1) = False (Arm al1 ml1 ar1 mr1) == (Arm al2 ml2 ar2 mr2) = ((al1 == al2 && ar1 == ar2 && ml1 == ml2 && mr1 == mr2) || (al1 == ar2 && ar1 == al2 && ml1 == mr2 && mr1 == ml2)) instance Ord Mobiel where compare m1 m2 = compare (gewicht m1) (gewicht m2)