
Hi again, sorry, now I see that it is not probably what you wanted because the first monad parameter does not depend on `a`. So better try this version where the first parameter is not a monad at all: update3 :: (a -> (r,a)) -> Int -> [a] -> State r [a] update3 f 0 (a:as) = let (r,a') = f a in put r >> return (a':as) update3 f i (a:as) = update3 f (i-1) as >>= return . (a:) Sincerely, Jan. On Fri, Jul 10, 2009 at 10:46:19AM +0100, Jan Jakubuv wrote:
Hello Geoffrey,
when you really want to make the first function parameter (`a -> (r,a)`) a monad, you can use `r` as the state instead of `a` (and `[a]`). Then both the first parameter and the result are in the same monad `State r` and you can write:
update2 :: State r a -> Int -> [a] -> State r [a] update2 sm 0 (a:as) = sm >>= return . (:as) update2 sm i (a:as) = update2 sm (i-1) as >>= return . (a:)
-- Heriot-Watt University is a Scottish charity registered under charity number SC000278.