The reason I ask is that I plan on making a simulation, which will run until the user decides to pause. Potentially, I could keep state and update it, but that doesn't seem haskelly. With an infinite list, I even get history for free. On Mon, Sep 13, 2010 at 7:34 PM, Felipe Lessa <felipe.lessa@gmail.com>wrote:
On Mon, Sep 13, 2010 at 7:53 PM, Alex Rozenshteyn <rpglover64@gmail.com> wrote:
Is there a way to take a given monad's bind and wrap it to make it more lazy? It doesn't seem like there should be, but I'm being hopeful.
I wouldn't bother with that. Just write the following and be happy =).
iterateM :: (Monad m) => Int -> (a -> m a) -> a -> m [a] iterateM 0 _ _ = return [] iterateM n act start = do next <- act start rest <- iterateM (n-1) act next return (start : rest)
However, I think the answer of your question is "no". And in cases where you can do something similar (e.g. in IO you can use unsafeInterleaveIO), most of the time it isn't the best solution.
Cheers!
-- Felipe.
-- Alex R