parse and evaluate math expressions
You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
Leonidas Boulougaris 57f096247e Corrected an issue in replaceVariable that was not adding padding in tokenized expression 9 months ago
src/Numeric Corrected an issue in replaceVariable that was not adding padding in tokenized expression 9 months ago
.gitignore initial commit 7 years ago
.travis.yml chore: remove stack 7.8.4 osx 6 years ago
LICENSE initial commit 7 years ago
README.md add travis badge 6 years ago
Setup.hs initial commit 7 years ago
mathexpr.cabal fix: move from Data.MathExpr to Numeric.MathExpr 6 years ago
stack.yaml initial commit 7 years ago

README.md

mathexpr Travis

Ever wanted to take as input a mathematical expression to fill in values and use it? mathexpr is exactly what you need.

I also wrote this in JavaScript some time ago: Equation

Examples

Simple evaluation of expressions:

import Data.MathExpr

main = do
  expr <- getLine -- a mathematical expression, e.g. sin x + y ^ 2
  -- replace x and y with the specified values and evaluate: sin 2 + 5 ^ 2 = 25.909..
  print $ evaluate def expr [("x", 2), ("y", 5)]

Using custom operators and functions:

import Data.MathExpr


-- operators are in the form (character, precedence, function)
-- example: ('+', 0, (+)), ('*', 1, (*))
-- the function should have the type (Double -> Double -> Double)
-- the higher the precedence, the sooner the operator operates

-- functions are in the form (name, function)
-- example: ("ln", log)
-- the function should have the type (Double -> Double)

main =
  let avg a b = (a + b) / 2
  let settings = Settings { operators = defaultOperators ++ [('~', 0, avg)]
                          , functions = defaultFunctions ++ [("trunc", fromIntegral . truncate)]
  evaluate settings "3 ~ 5" [] -- 4
  evaluate settings "trunc 1.1" [] -- 1