data Exp = Val Int | Mas Exp Exp | Menos Exp Exp | Por Exp Exp | Div Exp Exp {- antes de Div eval :: Exp -> Int eval (Val i) = i eval (Mas a b) = eval a + eval b eval (Menos a b) = eval a - eval b eval (Por a b) = eval a * eval b eval (Div a b) = eval a `div` eval b -} eval :: Exp -> Maybe Int eval (Val i) = Just i eval (Mas a b) = case eval a of Just x -> case eval b of Just y -> Just (x+y) Nothing -> Nothing Nothing -> Nothing eval (Menos a b) = case eval a of Just x -> case eval b of Just y -> Just (x-y) Nothing -> Nothing Nothing -> Nothing eval (Por a b) = case eval a of Just x -> case eval b of Just y -> Just (x*y) Nothing -> Nothing Nothing -> Nothing eval (Div a b) = case eval a of Just x -> case eval b of Just y -> if y == 0 then Nothing else Just (x `div` y) Nothing -> Nothing Nothing -> Nothing