<div>Hi,</div>
<div> Can someone explain how this lambda is suppose to work, I cannot figure out what it does?</div>
<div> </div>
<div> </div>
<div>data Lambda = Val Double<br> | Add Lambda Lambda<br> | Subtract Lambda Lambda<br> | Multiply Lambda Lambda<br> | Divide Lambda Lambda<br> | Var String<br>
| Let String Lambda Lambda<br> deriving Show</div>
<div>demo1 = (Add(Multiply(Divide(Subtract(Val 25)(Val 5))(Val 10))(Val 7))(Val 30))<br>--let x = 1+1 in 3 - x<br>test1 = Let "x" (Add (Val 1) (Val 1)) (Add(Var "x")(Var "x"))</div>
<div>test6 = Let "y" (Add (Val 7)(Val 6)) (Subtract (Val 6)(Var "y"))</div>
<div>-- 4 * (let x = 1+1 in 3 + x)<br>test2 = Multiply (Val 4) test1</div>
<div>-- x * (let x = 1+1 in 3 + x)<br>test3 = Let "y" (Add (Val 4)(Val 7))(Multiply test1 (Var "y"))</div>
<div>test5 = Add (test1) test6<br>type Dict =[(String,Lambda)]-- dictionary which takes a string and an expression<br>emptyDict :: Dict<br>emptyDict = []-- empty dictionary null set</div>
<div>addEntry :: String->Lambda ->Dict -> Dict<br>addEntry= \n e d -> (n,e): d -- add an entry we take a string,expression and a dictionary :gives back dictionary</div>
<div><br>lookupEntry :: String -> Dict -> Maybe Lambda<br>lookupEntry n [] = Nothing<br>lookupEntry n (x:xs) = if (n == k)-- if the entry is equal to <br> then (Just v)<br> else lookupEntry n xs -- find the value of n in the rest of the list<br>
where (k,v) = x -- <br> <br> </div>
<div>evalStep :: Dict -> Lambda -> Lambda<br>evalStep d (Val x) = (Val x)-- we have a dictionary and a value return the value</div>
<div><br>evalStep d(Add x y)-- dictionary and a add expression of 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</div>
<div>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) <br> = case e1 of<br> (Val a) -> case e2 of <br> (Val b)-> Val b<br> left -> evalStep (addEntry n e1 d)e2<br> right -> evalStep (addEntry n e1 d) e2<br> <br>evalStep d (Var x)<br>
= case lookup x d of<br> Just e -> e<br> Nothing -> error "Error in expression -- no definition for variable!"</div>
<div> <br>evaluate :: Dict-> [Lambda] -> Lambda -> 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</div>
<div><br>ev :: Dict-> [Lambda] -> Lambda -> IO() <br>ev = \d (x:xs) e ->do<br> 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</div>
<div> </div>
<div><br>isFree :: String -> Lambda -> Bool<br>isFree n1 (Let n2 e1 e2)<br> |n1 == n2 = False<br> |otherwise = True</div>
<div> </div>
<div>subst :: String -> Lambda -> Lambda->Lambda<br>subst n e1 e2<br> |isFree n e2 = subst' n e1 e2<br> |otherwise = e2</div>
<div>subst' :: String -> Lambda -> Lambda->Lambda<br>subst' n0 e1 (Var n1) <br> |n0 == n1 = e1<br> |otherwise = Var n1</div>
<div>subst' s v (Add e1 e2) = Add(subst' s v e1)(subst' s v e2)</div>
<div>subst' s v (Multiply e1 e2) = Multiply(subst' s v e1)(subst' s v e2)</div>
<div>subst' s v (Divide e1 e2) = Divide(subst' s v e1)(subst' s v e2)</div>
<div>subst' s v (Subtract e1 e2) = Subtract(subst' s v e1)(subst' s v e2)</div>
<div><br>subst' s v (Let n e1 e2) = Let n (subst' s v e1)(subst' s v e2)<br></div>
<div>John</div>