diff options
| author | Charles <sircharlesaze@gmail.com> | 2020-03-16 10:50:03 +0100 |
|---|---|---|
| committer | Charles <sircharlesaze@gmail.com> | 2020-03-16 10:50:03 +0100 |
| commit | d8751f2cced8f14366533ff0dbbc62fa73ec8665 (patch) | |
| tree | e216acbfb3d91cfe25870af93626240dbc7afcb3 /src/expr.hs | |
| parent | cc2593028c5f380e177adbf8905a43d665ac64cf (diff) | |
| download | computorv2-d8751f2cced8f14366533ff0dbbc62fa73ec8665.tar.gz computorv2-d8751f2cced8f14366533ff0dbbc62fa73ec8665.tar.bz2 computorv2-d8751f2cced8f14366533ff0dbbc62fa73ec8665.zip | |
Clean parser for expression containing rational and imaginary
Diffstat (limited to 'src/expr.hs')
| -rw-r--r-- | src/expr.hs | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/src/expr.hs b/src/expr.hs new file mode 100644 index 0000000..87a700b --- /dev/null +++ b/src/expr.hs @@ -0,0 +1,38 @@ +module Expr where + +import Atom + + +data Expr + = EAtom Atom + | Add Expr Expr + | Sub Expr Expr + | Mul Expr Expr + | Div Expr Expr + | Mod Expr Expr + | Exp Expr Expr + -- | Dot Expr Expr + + +eval :: Expr -> Maybe Atom +eval (EAtom a) = Just a +eval (Add e1 e2) = evalBin e1 e2 (+?) +eval (Sub e1 e2) = evalBin e1 e2 (-?) +eval (Mul e1 e2) = evalBin e1 e2 (*?) +eval (Div e1 e2) = evalBin e1 e2 (/?) +eval (Mod e1 e2) = evalBin e1 e2 (%?) +eval (Exp e1 e2) = evalBin e1 e2 (^?) + +evalBin :: Expr -> Expr -> (Atom -> Atom -> Maybe Atom) -> Maybe Atom +evalBin e1 e2 f = do a <- eval e1 + b <- eval e2 + f a b + +instance Show Expr where + show (EAtom a) = show a + show (Add e1 e2) = show e1 ++ " + " ++ show e2 + show (Sub e1 e2) = show e1 ++ " - " ++ show e2 + show (Mul e1 e2) = show e1 ++ " * " ++ show e2 + show (Div e1 e2) = show e1 ++ " / " ++ show e2 + show (Mod e1 e2) = show e1 ++ " % " ++ show e2 + show (Exp e1 e2) = show e1 ++ " ^ " ++ show e2 |
