Valor de una expresión aritmética con una variable
Las expresiones aritméticas construidas con una variable (denotada por X
), los números enteros y las operaciones de sumar y multiplicar se pueden representar mediante el tipo de datos Expr definido por
data Expr = X | C Int | S Expr Expr | P Expr Expr
Por ejemplo, la expresión X·(13+X)
se representa por
P X (S (C 13) X)
Definir la función
valor :: Expr -> Int -> Int
tal que valor e n
es el valor de la expresión e
cuando se sustituye su variable por n
. Por ejemplo,
valor (P X (S (C 13) X)) 2 == 30
Soluciones
A continuación se muestran las soluciones en Haskell y las soluciones en Python.
Soluciones en Haskell
data Expr = X | C Int | S Expr Expr | P Expr Expr valor :: Expr -> Int -> Int valor X n = n valor (C a) _ = a valor (S e1 e2) n = valor e1 n + valor e2 n valor (P e1 e2) n = valor e1 n * valor e2 n
Soluciones en Python
from dataclasses import dataclass @dataclass class Expr: pass @dataclass class X(Expr): pass @dataclass class C(Expr): x: int @dataclass class S(Expr): x: Expr y: Expr @dataclass class P(Expr): x: Expr y: Expr def valor(e: Expr, n: int) -> int: match e: case X(): return n case C(a): return a case S(e1, e2): return valor(e1, n) + valor(e2, n) case P(e1, e2): return valor(e1, n) * valor(e2, n) assert False