Aplicación de una función a una expresión aritmética
Usando el tipo de las expresiones aritméticas básicas, definir la función
aplica :: (Int -> Int) -> Expr -> Expr
tal que aplica f e
es la expresión obtenida aplicando la función f
a cada uno de los números de la expresión e
. Por ejemplo,
λ> aplica (+2) (S (P (C 3) (C 5)) (P (C 6) (C 7))) S (P (C 5) (C 7)) (P (C 8) (C 9)) λ> aplica (*2) (S (P (C 3) (C 5)) (P (C 6) (C 7))) S (P (C 6) (C 10)) (P (C 12) (C 14))
Soluciones
A continuación se muestran las soluciones en Haskell y las soluciones en Python.
Soluciones en Haskell
import Expresion_aritmetica_basica (Expr(..)) aplica :: (Int -> Int) -> Expr -> Expr aplica f (C x) = C (f x) aplica f (S e1 e2) = S (aplica f e1) (aplica f e2) aplica f (P e1 e2) = P (aplica f e1) (aplica f e2)
Soluciones en Python
from typing import Callable from src.expresion_aritmetica_basica import Expr, C, S, P def aplica(f: Callable[[int], int], e: Expr) -> Expr: match e: case C(x): return C(f(x)) case S(x, y): return S(aplica(f, x), aplica(f, y)) case P(x, y): return P(aplica(f, x), aplica(f, y)) assert False