Re: [Haskell-cafe] Monads as control structures?

On Thu, 27 Oct 2005, Creighton Hogg wrote:
On Thu, 27 Oct 2005, Robert Dockins wrote:
On Oct 27, 2005, at 11:54 AM, Creighton Hogg wrote:
Hi, so I'm a newbie getting used to Haskell. I'm writing some simple things like genetic algorithms in it for practice, and I keep coming across something that really bugs me: are there any standard libraries that allow you to do imperative style for or while loops using monads to keep track of state?
One way is to create a list of the actions you want to execute, and then use one of the sequence family of functions. The actions can share state with an IORef or STRef or whatever. Another option is to use a fold with >>= to allow actions to pass their results directly to the next action. This works even in "stateless" monads like the list monad.
Some examples using sequence:
forMonad :: Monad m => a -> (a -> Bool) -> (a -> a) -> (a -> m ()) -> m () forMonad init cond inc f = sequence_ $ map f $ takeWhile cond $ iterate inc init
xTimes :: Monad m => Int -> (Int -> m ()) -> m () xTimes x f = sequence_ $ map f [0..(x-1)]
main = do { forMonad 0 (<10) (+1) (putStrLn . show); xTimes 10 (\_ -> putStrLn "hi") }
Thanks to all who answered, this gives me a lot to chew on. I especially like these examples, because it makes me realize that I've been thinking about monads and evaluation wrong. I think doing genetic programming in Haskell is going to be easier than I thought.
participants (1)
-
Creighton Hogg