--Experiment with type system and monads main = do print (show (eval question 0)) -- the zero is the initial state data Term = Con Int | Div Term Term deriving Show question=Div(Div (Con 18) (Con 2)) (Con 3) type M a = State -> (a,State) type State = Int rtn :: a -> M a rtn a = \x -> (a,x) (>>>=) :: M a -> (a->M b) -> M b m >>>= k = \x -> let (a,y)=m x (b,z)=k a y in (b,z) tick :: M () tick = \x -> ((),x+1) eval :: Term -> M Int eval (Con a) = rtn a eval (Div t u) = eval(t) >>>= \a -> eval(u) >>>= \b -> tick >>>= \y -> rtn(a `div` b)