]> git.rkrishnan.org Git - yorgey.git/commitdiff
hw5: exercise 6
authorRamakrishnan Muthukrishnan <ram@rkrishnan.org>
Sun, 21 Dec 2014 16:21:10 +0000 (21:51 +0530)
committerRamakrishnan Muthukrishnan <ram@rkrishnan.org>
Sun, 21 Dec 2014 16:21:10 +0000 (21:51 +0530)
hw5/Calc.hs

index edc01791b0cad0bc69cb1dadc31805c5b9d336c3..0e50663d146dfbd2b852ac09c83dd24f8976a48d 100644 (file)
@@ -8,7 +8,7 @@ module Calc where
 import qualified ExprT as E
 import Parser
 import StackVM
-
+import qualified Data.Map as M
 
 
 -- exercise 1
@@ -70,3 +70,42 @@ instance Expr Program where
 
 compile :: String -> Maybe Program
 compile = parseExp lit add mul
+
+-- exercise 6
+data VarExprT = VarLit Integer
+              | VarAdd VarExprT VarExprT
+              | VarMul VarExprT VarExprT
+              | Var String
+  deriving (Show, Eq)
+
+class HasVars a where
+  var :: String -> a
+
+instance Expr VarExprT where
+  lit = VarLit
+  add = VarAdd
+  mul = VarMul
+
+instance HasVars VarExprT where
+  var = Var
+
+instance HasVars  (M.Map String Integer -> Maybe Integer) where
+  var x = M.lookup x
+
+instance Expr (M.Map String Integer -> Maybe Integer) where
+  lit x = \_ -> Just x
+  add x y = \m -> case (x m) of
+                    Just xv -> case (y m) of
+                                 Just yv -> Just (xv + yv)
+                                 Nothing -> Nothing
+                    Nothing -> Nothing
+  mul x y = \m -> case (x m) of
+                    Just xv -> case (y m) of
+                                 Just yv -> Just (xv * yv)
+                                 Nothing -> Nothing
+                    Nothing -> Nothing
+
+withVars :: [(String, Integer)]
+         -> (M.Map String Integer -> Maybe Integer)
+         -> Maybe Integer
+withVars vs exp = exp $ M.fromList vs