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. > _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe