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
1 |
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,
1 2 3 4 |
λ> 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.
1 2 3 4 5 6 |
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) |
1 2 3 4 5 6 7 8 9 10 11 12 |
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 |
Para resolver este problema podemos utilizar una función recursiva. La idea es recorrer la expresión e y aplicar la función f a cada uno de los números de la expresión. La forma en que recorremos la expresión dependerá del tipo de expresión que sea.
Por ejemplo, si e es una expresión del tipo C Int, entonces podemos aplicar la función f al número que contiene y devolver una nueva expresión C con el resultado de aplicar f:
Si e es una expresión del tipo S Expr Expr, entonces debemos recorrer ambas expresiones hijas y aplicar la función f a ellas. Luego, debemos devolver una nueva expresión del tipo S con las expresiones hijas modificadas:
Finalmente, si e es una expresión del tipo P Expr Expr, entonces debemos seguir el mismo proceso que para S. Es decir, debemos recorrer ambas expresiones hijas y aplicar la función f a ellas. Luego, debemos devolver una nueva expresión del tipo P con las expresiones hijas modificadas:
Teniendo en cuenta lo anterior, podemos implementar la función aplica de la siguiente manera: