diff --git a/LICENSE b/LICENSE
--- a/LICENSE
+++ b/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2011 Enzo Haussecker
+Copyright (c) 2012 Enzo Haussecker
 
 Permission is hereby granted, free of charge, to any person obtaining this work and associated documentation files (the "Work"), to deal in the Work without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Work, and to permit persons to whom the Work is furnished to do so, subject to the following conditions:
 
diff --git a/LICENSE~ b/LICENSE~
new file mode 100644
--- /dev/null
+++ b/LICENSE~
@@ -0,0 +1,7 @@
+Copyright (c) 2011 Enzo Haussecker
+
+Permission is hereby granted, free of charge, to any person obtaining this work and associated documentation files (the "Work"), to deal in the Work without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Work, and to permit persons to whom the Work is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies of the Work.
+
+THE WORK IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE WORK OR THE USE OR OTHER DEALINGS IN THE WORK.
diff --git a/ParserFunction.cabal b/ParserFunction.cabal
--- a/ParserFunction.cabal
+++ b/ParserFunction.cabal
@@ -1,5 +1,5 @@
 name:          ParserFunction
-version:       0.0.7
+version:       0.0.8
 cabal-version: >= 1.6
 license:       BSD3
 license-file:  LICENSE
diff --git a/ParserFunction.cabal~ b/ParserFunction.cabal~
new file mode 100644
--- /dev/null
+++ b/ParserFunction.cabal~
@@ -0,0 +1,22 @@
+name:          ParserFunction
+version:       0.0.7
+cabal-version: >= 1.6
+license:       BSD3
+license-file:  LICENSE
+author:        Enzo Haussecker
+maintainer:    ehaussecker@gmail.com
+category:      Parsing
+build-type:    Simple
+
+synopsis:      Utilities for parsing and evaluating mathematical expressions.
+
+description:
+    ParserFunction provides utilities for parsing and evaluating mathematical expressions. The central parsing
+    function in this package is @stringToExpr@, which parses a string-expression and returns a maybe expression tree.
+    This tree is suitable for performing symbolic manipulation. Expressions can then be evaluated using the function
+    @evalExpr@. If you wish to evaluate a string-expression without any intermediate operations, simply use the function
+    @evalString@. Examples of these functions can be seen by viewing the source code of this module.
+
+Library
+  exposed-modules: Text.ParserCombinators.Parsec.ParserFunction
+  build-depends:   base < 6, parsec, containers
diff --git a/Text/ParserCombinators/Parsec/ParserFunction.hs b/Text/ParserCombinators/Parsec/ParserFunction.hs
--- a/Text/ParserCombinators/Parsec/ParserFunction.hs
+++ b/Text/ParserCombinators/Parsec/ParserFunction.hs
@@ -25,8 +25,9 @@
 --
 
 module Text.ParserCombinators.Parsec.ParserFunction
-  (Expr,evalString,evalExpr,stringToExpr,buildExpr,eval) where
+  (Expr,Variable,evalString,evalExpr,stringToExpr,buildExpr,eval) where
 
+import Control.Monad (liftM,liftM2)
 import Text.ParserCombinators.Parsec.Expr 
 import Text.ParserCombinators.Parsec
 import qualified Data.Map as M
@@ -134,45 +135,38 @@
     Just (Var "i")    -> Just $ 0 :+ 1
     Just (Var "e")    -> Just $ exp 1
     Just (Var c)      -> M.lookup c m
-    Just (Add e1 e2)  -> factorMaybe2 (eval m $ Just e1) (eval m $ Just e2) (+)
-    Just (Sub e1 e2)  -> factorMaybe2 (eval m $ Just e1) (eval m $ Just e2) (-)
-    Just (Mul e1 e2)  -> factorMaybe2 (eval m $ Just e1) (eval m $ Just e2) (*)
-    Just (Div e1 e2)  -> factorMaybe2 (eval m $ Just e1) (eval m $ Just e2) (/)
-    Just (Pow e1 e2)  -> factorMaybe2 (eval m $ Just e1) (eval m $ Just e2) (**)
-    Just (Exp e1)     -> factorMaybe1 (eval m $ Just e1) (exp)
-    Just (Sqrt e1)    -> factorMaybe1 (eval m $ Just e1) (\x->x**(0.5))
-    Just (Cbrt e1)    -> factorMaybe1 (eval m $ Just e1) (\x->x**(1/3))
-    Just (Log e1)     -> factorMaybe1 (eval m $ Just e1) (log)
-    Just (Abs e1)     -> factorMaybe1 (eval m $ Just e1) (abs)
-    Just (Sin e1)     -> factorMaybe1 (eval m $ Just e1) (sin)
-    Just (Cos e1)     -> factorMaybe1 (eval m $ Just e1) (cos)
-    Just (Tan e1)     -> factorMaybe1 (eval m $ Just e1) (tan)
-    Just (Sec e1)     -> factorMaybe1 (eval m $ Just e1) (\x->1/sin x)
-    Just (Csc e1)     -> factorMaybe1 (eval m $ Just e1) (\x->1/cos x)
-    Just (Cot e1)     -> factorMaybe1 (eval m $ Just e1) (\x->1/tan x)
-    Just (Sinh e1)    -> factorMaybe1 (eval m $ Just e1) (sinh)
-    Just (Cosh e1)    -> factorMaybe1 (eval m $ Just e1) (cosh)
-    Just (Tanh e1)    -> factorMaybe1 (eval m $ Just e1) (tanh)
-    Just (Sech e1)    -> factorMaybe1 (eval m $ Just e1) (\x->1/sinh x)
-    Just (Csch e1)    -> factorMaybe1 (eval m $ Just e1) (\x->1/cosh x)
-    Just (Coth e1)    -> factorMaybe1 (eval m $ Just e1) (\x->1/tanh x)
-    Just (ArcSin e1)  -> factorMaybe1 (eval m $ Just e1) (asin)
-    Just (ArcCos e1)  -> factorMaybe1 (eval m $ Just e1) (acos)
-    Just (ArcTan e1)  -> factorMaybe1 (eval m $ Just e1) (atan)
-    Just (ArcSec e1)  -> factorMaybe1 (eval m $ Just e1) (\x->1/asin x)
-    Just (ArcCsc e1)  -> factorMaybe1 (eval m $ Just e1) (\x->1/acos x)
-    Just (ArcCot e1)  -> factorMaybe1 (eval m $ Just e1) (\x->1/atan x)
-    Just (ArcSinh e1) -> factorMaybe1 (eval m $ Just e1) (asinh)
-    Just (ArcCosh e1) -> factorMaybe1 (eval m $ Just e1) (acosh)
-    Just (ArcTanh e1) -> factorMaybe1 (eval m $ Just e1) (atanh)
-    Just (ArcSech e1) -> factorMaybe1 (eval m $ Just e1) (\x->1/asinh x)
-    Just (ArcCsch e1) -> factorMaybe1 (eval m $ Just e1) (\x->1/acosh x)
-    Just (ArcCoth e1) -> factorMaybe1 (eval m $ Just e1) (\x->1/atanh x)
+    Just (Add e1 e2)  -> liftM2 (+)  (eval m $ Just e1) (eval m $ Just e2)
+    Just (Sub e1 e2)  -> liftM2 (-)  (eval m $ Just e1) (eval m $ Just e2)
+    Just (Mul e1 e2)  -> liftM2 (*)  (eval m $ Just e1) (eval m $ Just e2)
+    Just (Div e1 e2)  -> liftM2 (/)  (eval m $ Just e1) (eval m $ Just e2)
+    Just (Pow e1 e2)  -> liftM2 (**) (eval m $ Just e1) (eval m $ Just e2)
+    Just (Exp e1)     -> liftM (exp) (eval m $ Just e1)
+    Just (Sqrt e1)    -> liftM (\x->x**(0.5)) (eval m $ Just e1)
+    Just (Cbrt e1)    -> liftM (\x->x**(1/3)) (eval m $ Just e1)
+    Just (Log e1)     -> liftM (log) (eval m $ Just e1)
+    Just (Abs e1)     -> liftM (abs) (eval m $ Just e1)
+    Just (Sin e1)     -> liftM (sin) (eval m $ Just e1)
+    Just (Cos e1)     -> liftM (cos) (eval m $ Just e1)
+    Just (Tan e1)     -> liftM (tan) (eval m $ Just e1)
+    Just (Sec e1)     -> liftM (\x->1/sin x) (eval m $ Just e1)
+    Just (Csc e1)     -> liftM (\x->1/cos x) (eval m $ Just e1)
+    Just (Cot e1)     -> liftM (\x->1/tan x) (eval m $ Just e1)
+    Just (Sinh e1)    -> liftM (sinh) (eval m $ Just e1)
+    Just (Cosh e1)    -> liftM (cosh) (eval m $ Just e1)
+    Just (Tanh e1)    -> liftM (tanh) (eval m $ Just e1)
+    Just (Sech e1)    -> liftM (\x->1/sinh x) (eval m $ Just e1)
+    Just (Csch e1)    -> liftM (\x->1/cosh x) (eval m $ Just e1)
+    Just (Coth e1)    -> liftM (\x->1/tanh x) (eval m $ Just e1)
+    Just (ArcSin e1)  -> liftM (asin) (eval m $ Just e1)
+    Just (ArcCos e1)  -> liftM (acos) (eval m $ Just e1)
+    Just (ArcTan e1)  -> liftM (atan) (eval m $ Just e1)
+    Just (ArcSec e1)  -> liftM (\x->1/asin x) (eval m $ Just e1)
+    Just (ArcCsc e1)  -> liftM (\x->1/acos x) (eval m $ Just e1)
+    Just (ArcCot e1)  -> liftM (\x->1/atan x) (eval m $ Just e1)
+    Just (ArcSinh e1) -> liftM (asinh) (eval m $ Just e1)
+    Just (ArcCosh e1) -> liftM (acosh) (eval m $ Just e1)
+    Just (ArcTanh e1) -> liftM (atanh) (eval m $ Just e1)
+    Just (ArcSech e1) -> liftM (\x->1/asinh x) (eval m $ Just e1)
+    Just (ArcCsch e1) -> liftM (\x->1/acosh x) (eval m $ Just e1)
+    Just (ArcCoth e1) -> liftM (\x->1/atanh x) (eval m $ Just e1)
     _                      -> Nothing
-    where
-      factorMaybe1 :: Maybe a -> (a -> a) -> Maybe a
-      factorMaybe1 (Just x) f = Just $ f x
-      factorMaybe1 _        _ = Nothing
-      factorMaybe2 :: Maybe a -> Maybe a -> (a -> a -> a) -> Maybe a
-      factorMaybe2 (Just x) (Just y) f = Just $ f x y
-      factorMaybe2 _        _        _ = Nothing
