¿Cómo puedo simplificar una expresión aritmética básica?¿Cómo puedo simplificar una expresión aritmética básica?
p. Ej.
module ExprOps where
simplify :: Expr -> Expr
simplify (Plus(Var"x") (Const 0)) = Var "x"
¿Qué tengo que hacer?
module Expr where
-- Variables are named by strings, assumed to be identifiers.
type Variable = String
-- Representation of expressions.
data Expr = Const Integer
| Var Variable
| Plus Expr Expr
| Minus Expr Expr
| Mult Expr Expr
deriving (Eq, Show)
Las simplificaciones que tengo en mente son:
0*e = e*0 = 0
1*e = e*1 = 0+e = e+0 = e-0 = e
y simplificando subexpresiones constantes, por ejemplo Plus (Const 1) (Const 2) se convertiría en Const 3. No esperaría que las variables (o variables y constantes) se concatenan: Var "st" es una variable distinta de Var "s".
Lo que quiero lograr es crear un módulo similar a la anterior que utiliza una función llamada simplify :: Expr->Expr
racionales
El ejemplo proporcionado por @ user41000 solo tiene dos hijos. ¿Qué tengo que pensar al extenderlo a más de 2 términos, por ejemplo: simplificar (Plus (Plus (Const 2) (Const 1)) (Const 3)) = Const 6. ¿Cómo funciona la recursión aquí? – plopd
Puede ajustar un poco las cosas para que sea más agresivo que lo que escribí en la parte superior de mi cabeza: 'simplificar (Plus ab) = caso (simplificar a, simplificar b) de (Const ca, Const cb) -> Const (ca + cb) ' etc. Alternativamente, puede utilizar el combinador' rewrite' de la lente para hacer lo mismo en un punto fijo. –