Se considera el tipo de las expresiones aritméticas definido por
data Expr = Lit Int | Suma Expr Expr | Op Expr | SiCero Expr Expr Expr deriving (Eq, Show) |
formado por
- literales (p.e. Lit 7),
- sumas (p.e. Suma (Lit 7) (Suma (Lit 3) (Lit 5)))
- opuestos (p.e. Op (Suma (Op (Lit 7)) (Suma (Lit 3) (Lit 5))))
- expresiones condicionales (p.e. (SiCero (Lit 3) (Lit 4) (Lit 5))
Definir la función
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,
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.
data Expr = Lit Int | Suma Expr Expr | Op Expr | SiCero Expr Expr Expr deriving (Eq, Show) 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 |
from dataclasses import dataclass @dataclass class Expr: pass @dataclass class Lit(Expr): x: int @dataclass class Suma(Expr): x: Expr y: Expr @dataclass class Op(Expr): x: Expr @dataclass class SiCero(Expr): x: Expr y: Expr z: Expr 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 |