Skip to content

Instantly share code, notes, and snippets.

@5outh
Last active December 16, 2015 20:10
Show Gist options
  • Select an option

  • Save 5outh/5490732 to your computer and use it in GitHub Desktop.

Select an option

Save 5outh/5490732 to your computer and use it in GitHub Desktop.
simplify function
simplify :: (Num a, Eq a, Floating a) => Expr a -> Expr a
simplify (Const a :+: Const b) = Const (a + b)
simplify (a :+: Const 0) = simplify a
simplify (Const 0 :+: a ) = simplify a
simplify (Const a :*: Const b) = Const (a*b)
simplify (a :*: Const 1) = simplify a
simplify (Const 1 :*: a) = simplify a
simplify (a :*: Const 0) = Const 0
simplify (Const 0 :*: a) = Const 0
simplify (Const a :^: Const b) = Const (a**b)
simplify (a :^: Const 1) = simplify a
simplify (a :^: Const 0) = Const 1
simplify ((c :^: Const b) :^: Const a) = c :^: (Const (a*b))
simplify (Const a :*: (Const b :*: expr)) = (Const $ a*b) :*: (simplify expr)
simplify (Const a :*: expr :*: Const b) = (Const $ a*b) :*: (simplify expr)
simplify (expr :*: Const a :*: Const b) = (Const $ a*b) :*: (simplify expr)
simplify (Const a :*: (b :+: c)) = (Const a :*: (simplify b)) :+: (Const a :*: (simplify c))
simplify (Const 0 :/: a ) = Const 0
simplify (Const a :/: Const 0) = error "Division by zero!"
simplify (Const a :/: Const b) | a == b = Const 1 -- only when a == b
simplify (a :/: Const 1) = simplify a
simplify (a :/: b) = (simplify a) :/: (simplify b)
simplify (a :^: b) = (simplify a) :^: (simplify b)
simplify (a :*: b) = (simplify a) :*: (simplify b)
simplify (a :+: b) = (simplify a) :+: (simplify b)
simplify x = id x
fullSimplify expr = fullSimplify' expr (Const 0) -- placeholder
where fullSimplify' cur last | cur == last = cur
| otherwise = let cur' = simplify cur
in fullSimplify' cur' cur
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment