Untitled
unknown
plain_text
2 years ago
2.0 kB
7
Indexable
module Ficha8 where
--2
data Exp a = Const a
| Simetrico (Exp a)
| Mais (Exp a) (Exp a)
| Menos (Exp a) (Exp a)
| Mult (Exp a) (Exp a)
-- deriving Eq
--e = 3 + (4 * 5)
e :: Exp Int
e = (Const 3) `Mais` ((Const 4) `Mult` (Const 5))
e' :: Exp Int
e' = (Const 3) `Mais` (Const 4) `Mult` (Const 5)
--a)
pp :: Show a => Exp a -> String
pp (Const v) = show v
pp (Simetrico e) = "( - " ++ pp e ++ ")"
pp (Mais e1 e2) = "(" ++ pp e1 ++ " + " ++ pp e2 ++ ")"
pp (Menos e1 e2) = "(" ++ pp e1 ++ " - " ++ pp e2 ++ ")"
pp (Mult e1 e2) = "(" ++ pp e1 ++ " * " ++ pp e2 ++ ")"
instance Show a => Show (Exp a) where
show e = pp e
--b)
-- Duas expressões são iguais quando o seu valor é igual
calcula :: Num a => Exp a -> a
calcula (Const v) = v
calcula (Simetrico e) = - (calcula e)
calcula (Mais e1 e2) = calcula e1 + calcula e2
calcula (Menos e1 e2) = calcula e1 - calcula e2
calcula (Mult e1 e2) = calcula e1 * calcula e2
iguais :: (Num a, Eq a) => Exp a -> Exp a -> Bool
iguais e1 e2 = calcula e1 == calcula e2
instance (Num a, Eq a) => Eq (Exp a) where
(==) = iguais
-- Ord a
menorIgual :: (Num a, Ord a) => Exp a -> Exp a -> Bool
menorIgual e1 e2 = calcula e1 <= calcula e2
instance (Num a, Ord a) => Ord (Exp a) where
(<=) = menorIgual
-- Contas
maisExp :: Num a => Exp a -> Exp a -> Exp a
maisExp e1 e2 = Const (calcula e1 + calcula e2)
menosExp :: Num a => Exp a -> Exp a -> Exp a
menosExp e1 e2 = Const (calcula e1 - calcula e2)
multExp :: Num a => Exp a -> Exp a -> Exp a
multExp e1 e2 = Const (calcula e1 * calcula e2)
absExp :: Num a => Exp a -> Exp a
absExp e = Const $ abs $ calcula e
signumExp :: Num a => Exp a -> Exp a
signumExp e = Const $ signum $ calcula e
fromIntegerExp :: Num a => Integer -> Exp a
fromIntegerExp i = Const (fromInteger i)
instance Num a => Num (Exp a) where
(+) = maisExp
(-) = menosExp
(*) = multExp
abs = absExp
signum = signumExp
fromInteger = fromIntegerExp
Editor is loading...
Leave a Comment