[ create a new paste ] login | about

Link: http://codepad.org/ydhOd86Y    [ raw code | output | fork ]

Haskell, pasted on Oct 14:
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


Output:
1
2
3
4
remove parents: Val 4 | Val 1 :*: Val 3 | Val 2 :*: Val 3
(Val 4 :+: Val 1 :*: Val 3) :+: Val 2 :*: Val 3
(Val 1 :*: Val 4 :+: Val 2 :*: Val 4) :+: Val 3 :*: Val 4
((Val 1 :*: Val 1 :+: Val 1 :*: Val 1) :+: Val 1 :*: Val 1) :+: Val 1 :*: Val 1


Create a new paste based on this one


Comments: