<div>Hi,</div>
<div> This gives me the explaination that it expecting a Expression but it been giving a IO b can some explain whats going on please. </div>
<div> </div>
<div>import Maybe</div>
<div>data Expression = Val Double<br> | Add Expression Expression<br> | Subtract Expression Expression<br> | Multiply Expression Expression<br> | Divide Expression Expression<br>
| Var String<br> | Let String Expression Expression<br> deriving Show</div>
<div>demo1 = (Add(Multiply(Divide(Subtract(Val 25)(Val 5))(Val 10))(Val 7))(Val 30))</div>
<div>type Dict =[(String,Expression)]<br>emptyDict :: Dict<br>emptyDict = []</div>
<div>addEntry :: String->Expression ->Dict -> Dict<br>addEntry n e d = (n,e): d</div>
<div>lookupEntry :: String -> Dict -> Maybe Expression<br>lookupEntry n [] = Nothing<br>lookupEntry n (x:xs) = if (n == k)<br> then (Just v)<br> else lookupEntry n xs<br> where (k,v) = x</div>
<div>evalStep :: Dict -> Expression -> Expression<br>evalStep d(Val x)= (Val x)</div>
<div><br>evalStep d(Add x y)<br> = case x of<br> (Val a) -> case y of<br> (Val b) -> Val (a+b)<br> left -> Add x (evalStep d y)<br> right -> Add (evalStep d x)y</div>
<div>evalStep d(Subtract x y)<br> = case x of<br> (Val a) -> case y of<br> (Val b) -> Val (a-b)<br> left -> Subtract x (evalStep d y)<br> right -> Subtract (evalStep d x)y</div>
<div>evalStep d(Multiply x y)<br> = case x of<br> (Val a) -> case y of<br> (Val b) -> Val (a*b)<br> left -> Multiply x (evalStep d y)<br> right -> Multiply (evalStep d x)y<br>
evalStep d (Divide x y)<br> = case x of<br> (Val a) -> case y of<br> (Val b) -> Val (a/b)<br> left -> Divide x (evalStep d y)<br> right -> Divide (evalStep d x)y</div>
<div>evalStep d (Let n e1 e2) = do<br> putStrLn ("Adding definition for "++n)<br> v <- evalStep d (addEntry n e1 d) e2<br> putStrLn ("Removing definition for "++n)<br> return v</div>
<div><br>evaluate :: Dict-> [Expression] -> Expression -> IO ()<br>evaluate d(x:xs) e = do</div>
<div> putStrLn (show e)<br> putStrLn "Do another step (y/n) or rollback (r)? :"<br> c <- getLine<br> case c of<br> "y" -> let e'= (evalStep d e)in evaluate d (e:x:xs) e'-- build up history<br>
<br> "r" -> case (x:xs) of<br> (x:xs)-> evaluate d xs x<br> []-> do { putStrLn "Empty"<br> ;evaluate d(x:xs) e<br> } <br> "n" -> putStrLn $ "Ok you said no :" ++ c<br>
<br> <br>John</div>