Evaluación de expresiones aritméticas
Las expresiones aritméticas se pueden definir mediante el siguiente tipo de dato
1 2 |
data Expr = N Int | V Char | Sum Expr Expr | Mul Expr Expr deriving Show |
Por ejemplo, (x+3)+(7*y) se representa por
1 2 |
ejExpr :: Expr ejExpr = Sum (Sum (V 'x') (N 3))(Mul (N 7) (V 'y')) |
Definir la función
1 |
valor :: Expr -> Maybe Int |
tal que (valor e) es ‘Just v’ si la expresión e es numérica y v es su valor, o bien ‘Nothing’ si e no es numérica. Por ejemplo:
1 2 3 |
valor (Sum (N 7) (N 9)) == Just 16 valor (Sum (Sum (V 'x') (N 3))(Mul (N 7) (V 'y'))) == Nothing valor (Sum (Sum (N 1) (N 3))(Mul (N 7) (N 2))) == Just 18 |
Soluciones
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
data Expr = N Int | V Char | Sum Expr Expr | Mul Expr Expr deriving Show -- 1ª solución -- =========== valor1 :: Expr -> Maybe Int valor1 e | null (aux e) = Nothing | otherwise = Just (head (aux e)) where aux (N x) = [x] aux (V _) = [] aux (Sum e1 e2) = [x+y| x <- aux e1, y <- aux e2] aux (Mul e1 e2) = [x*y| x <- aux e1, y <- aux e2] -- 2ª solución -- =========== valor2 :: Expr -> Maybe Int valor2 e | numerico e = Just (aux e) | otherwise = Nothing where aux (N x) = x aux (Sum e1 e2) = aux e1 + aux e2 aux (Mul e1 e2) = aux e1 * aux e2 numerico :: Expr -> Bool numerico (N _) = True numerico (V _) = False numerico (Sum e1 e2) = numerico e1 && numerico e2 numerico (Mul e1 e2) = numerico e1 && numerico e2 |
erisan, en numerico (Mul x y) yo he usado ‘numerico (Mul x y) = numerico x * numerico ‘, se te ha escapado ahi poner un «*» o el resultado bueno es con el «+»?