From d8751f2cced8f14366533ff0dbbc62fa73ec8665 Mon Sep 17 00:00:00 2001 From: Charles Date: Mon, 16 Mar 2020 10:50:03 +0100 Subject: Clean parser for expression containing rational and imaginary --- src/expr.hs | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 src/expr.hs (limited to 'src/expr.hs') 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 -- cgit