<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-&gt;Expression -&gt;Dict -&gt; Dict<br>addEntry n e d = (n,e): d</div>
<div>lookupEntry :: String -&gt; Dict -&gt; 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 -&gt; Expression -&gt;  Expression<br>evalStep d(Val x)=  (Val x)</div>
<div><br>evalStep d(Add x y)<br>  = case x of<br>      (Val a) -&gt; case y of<br>                   (Val b) -&gt; Val (a+b)<br>                   left -&gt; Add x (evalStep d y)<br>      right -&gt; Add (evalStep d x)y</div>

<div>evalStep d(Subtract x y)<br>  = case x of<br>      (Val a) -&gt; case y of<br>                   (Val b) -&gt; Val (a-b)<br>                   left -&gt; Subtract x (evalStep d y)<br>      right -&gt; Subtract (evalStep d x)y</div>

<div>evalStep d(Multiply x y)<br>  = case x of<br>      (Val a) -&gt; case y of<br>                   (Val b) -&gt; Val (a*b)<br>                   left -&gt; Multiply x (evalStep d y)<br>      right -&gt; Multiply (evalStep d x)y<br>
evalStep d (Divide x y)<br>  = case x of<br>      (Val a) -&gt; case y of<br>                   (Val b) -&gt; Val (a/b)<br>                   left -&gt; Divide x (evalStep d y)<br>      right -&gt; Divide (evalStep d x)y</div>

<div>evalStep d (Let n e1 e2) = do<br>       putStrLn (&quot;Adding definition for &quot;++n)<br>       v &lt;- evalStep d (addEntry n e1 d) e2<br>       putStrLn (&quot;Removing definition for &quot;++n)<br>       return v</div>

<div><br>evaluate :: Dict-&gt; [Expression] -&gt; Expression -&gt; IO ()<br>evaluate d(x:xs) e = do</div>
<div>     putStrLn (show e)<br>     putStrLn &quot;Do another step (y/n) or rollback (r)? :&quot;<br>     c &lt;- getLine<br>     case c of<br>       &quot;y&quot; -&gt; let e&#39;= (evalStep d e)in evaluate d (e:x:xs) e&#39;-- build up history<br>
                 <br>       &quot;r&quot; -&gt;  case (x:xs) of<br>  (x:xs)-&gt; evaluate d xs x<br>  []-&gt; do { putStrLn &quot;Empty&quot;<br>   ;evaluate d(x:xs) e<br>  } <br>       &quot;n&quot;  -&gt;  putStrLn $ &quot;Ok you said no :&quot; ++ c<br>
                                           <br>                 <br>John</div>