data InfoUpdt i a = InfoUpdt (i -> (a,i)) instance Monad (InfoUpdt i) where return a = InfoUpdt (\i -> (a,i)) (InfoUpdt f) >>= k = InfoUpdt h where h i = let (a,i') = f i in (let (InfoUpdt ki) = k a in ki i')