diff --git a/mathexpr.cabal b/mathexpr.cabal index b4ca758..2b47539 100644 --- a/mathexpr.cabal +++ b/mathexpr.cabal @@ -1,5 +1,5 @@ name: mathexpr -version: 0.1.0.0 +version: 0.2.0.0 synopsis: Parse and evaluate math expressions with variables and functions description: A simple tool to evaluate math expressions as strings with support for custom functions and operators homepage: https://github.com/mdibaiee/mathexpr diff --git a/src/Data/MathExpr.hs b/src/Data/MathExpr.hs index 405db19..85a22b3 100644 --- a/src/Data/MathExpr.hs +++ b/src/Data/MathExpr.hs @@ -1,3 +1,4 @@ +{-# Language ScopedTypeVariables #-} module Data.MathExpr ( evaluate , Settings (..) @@ -6,7 +7,6 @@ module Data.MathExpr ) where import Data.Default.Class import Data.Maybe (isJust, fromJust) - import Debug.Trace import Data.List (find) data Settings = Settings { operators :: [(Char, Int, Double -> Double -> Double)] @@ -78,9 +78,13 @@ module Data.MathExpr fns = functions settings helper :: [String] -> [String] -> Double + -- negative numbers come in the form ["num", "-"] helper [] [o] = read o helper (c:cs) os - | isOperator c = + | c == "-" && length os < 2 = + let result :: Double = negate . read . head $ cs + in helper (tail cs) $ (show result) : os + | isOperator c && length os >= 2 = let result = (operatorFunction c) (read . head . tail $ os) (read . head $ os) in helper cs $ (show result) : drop 2 os | isFunction c =