
Am Samstag 23 Januar 2010 18:40:10 schrieb John Moore:
Hi I'm trying to get a if statement to work but not sure if this is the right approach,
I think pattern matching and case .. of would be better suited.
what I want to do in simple english is to evaluate one expression at a time for example. (3+2)+(4+5) I want it to return 5 + (4+5) then 5+9.
data Expression = Val Integer
| Add Expression Expression | Subtract Expression Expression | Multiply Expression Expression | Divide Expression Expression
deriving Show evalStep :: Expression -> Expression evalStep (Val x)= (Val x)
evalStep (Add x y) = do
if x = isDigit then if y isDigit else evalStep x,y
-- evaluate one step only evalStep (Add x y) = case x of (Val v) -> case y of (Val w) -> Val (v+w) other -> Add x (evalStep y) other -> Add (evalStep x) y evalStep (Subtract x y) ... -- analogously, also Multiply and Divide evalStep e = e -- only Val left. VoilĂ , the leftmost innermost compound expression is reduced if the expression isn't fully evaluated. To completely evaluate: eval :: Expression -> Expression eval e@(Val _) = e eval e = eval (evalStep e)
I thinking about using recursion down a tree left then right but that seems very complicated. Any thoughts welcome! John