module Main where
import Debug.Trace
infixl 6 :+:
infixl 7 :*:
data Expr = Val Int | Expr :+: Expr | Expr :*: Expr
deriving (Show, Eq)
expand :: Expr -> Expr
expand expr = if expr == expanded then expanded else expand expanded
where
expanded = expand' expr
expand' :: Expr -> Expr
expand' (e :+: (e1 :+: e2)) = trace ("remove parents: " ++ show e ++ " | " ++ show e1 ++ " | "++ show e2) expand e :+: expand e1 :+: expand e2
expand' ((e :+: e1) :+: e2) = expand e :+: expand e1 :+: expand e2
expand' (e :*: (e1 :*: e2)) = expand e :*: expand e1 :*: expand e2
expand' ((e :*: e1) :*: e2) = expand e :*: expand e1 :*: expand e2
expand' ((e1 :+: e2) :*: e) = expand e1 :*: expand e :+: expand e2 :*: expand e
expand' (e :*: (e1 :+: e2)) = expand e :*: expand e1 :+: expand e :*: expand e2
expand' (e1 :+: e2) = expand e1 :+: expand e2
expand' (e1 :*: e2) = expand e1 :*: expand e2
expand' e = e
main :: IO()
main = do
print $ expand e1
print $ expand e2
print $ expand e3
where
e1 = Val 4 :+: (Val 1 :+: Val 2) :*: Val 3
e2 = (Val 1 :+: Val 2 :+: Val 3) :*: Val 4
e3 = ((Val 1 :*: Val 1 :+: Val 1 :*: Val 1) :+: Val 1 :*: Val 1) :+: Val 1 :*: Val 1