aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Expr.hs2
-rw-r--r--RealCalc.hs6
2 files changed, 8 insertions, 0 deletions
diff --git a/Expr.hs b/Expr.hs
index 2210735..6e12a87 100644
--- a/Expr.hs
+++ b/Expr.hs
@@ -30,6 +30,7 @@ data Expr = Plus Expr Expr
| Minus Expr Expr
| Times Expr Expr
| Div Expr Expr
+ | Pow Expr Expr
| EInt Integer
| EFloat Double
| E
@@ -66,6 +67,7 @@ prefix name fun = Prefix (fun <$ tokenS name)
table :: [[Operator String u Data.Functor.Identity.Identity Expr]]
table = [ [ prefix "log" Log, prefix "sin" Sin, prefix "cos" Cos, prefix "sqrt" Sqrt ]
, [ prefix "-" Negate ]
+ , [ binary "^" Pow AssocLeft ]
, [ binary "*" Times AssocLeft
, binary "/" Div AssocLeft
]
diff --git a/RealCalc.hs b/RealCalc.hs
index 11eebe4..df2e06d 100644
--- a/RealCalc.hs
+++ b/RealCalc.hs
@@ -54,6 +54,12 @@ simplify (Expr.Times e1 e2) =
genericCombine (*) (simplify e1) (simplify e2)
simplify (Expr.Div e1 e2) =
RFloat (rToDouble (simplify e1) / rToDouble (simplify e2))
+simplify (Expr.Pow e1 e2) =
+ case (simplify e1, simplify e2) of
+ (RInt a, RInt b)
+ | b >= 0 -> RInt (a ^ b)
+ (a, RInt b) -> RFloat (rToDouble a ^^ b)
+ (a, RFloat b) -> RFloat (rToDouble a ** b)
simplify (Expr.EInt i) = RInt i
simplify (Expr.EFloat d) = RFloat d
simplify Expr.E = RFloat (exp 1)