El tipo de las expresiones aritméticas: Valor de una expresión
Usando el tipo de las expresiones aritméticas, definir la función
1 |
valor :: Expr -> Int |
tal que valor e
es el valor de la expresión e
(donde el valor de SiCero e e1 e2
es el valor de e1
si el valor de e
es cero y el es el valor de e2
, en caso contrario). Por ejemplo,
1 2 3 |
valor (Op (Suma (Lit 3) (Lit 5))) == -8 valor (SiCero (Lit 0) (Lit 4) (Lit 5)) == 4 valor (SiCero (Lit 1) (Lit 4) (Lit 5)) == 5 |
Soluciones
A continuación se muestran las soluciones en Haskell y las soluciones en Python.
1 2 3 4 5 6 7 8 |
import Tipo_expresion_aritmetica (Expr (..)) valor :: Expr -> Int valor (Lit n) = n valor (Suma x y) = valor x + valor y valor (Op x) = - valor x valor (SiCero x y z) | valor x == 0 = valor y | otherwise = valor z |
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 30 31 32 |
from src.tipo_expresion_aritmetica import Expr, Lit, Op, SiCero, Suma # 1ª solución # =========== def valor(e: Expr) -> int: match e: case Lit(n): return n case Suma(x, y): return valor(x) + valor(y) case Op(x): return -valor(x) case SiCero(x, y, z): return valor(y) if valor(x) == 0 else valor(z) assert False # 2ª solución # =========== def valor2(e: Expr) -> int: if isinstance(e, Lit): return e.x if isinstance(e, Suma): return valor2(e.x) + valor2(e.y) if isinstance(e, Op): return -valor2(e.x) if isinstance(e, SiCero): if valor2(e.x) == 0: return valor2(e.y) return valor2(e.z) assert False |