
On Tue, Oct 04, 2016 at 01:51:04PM +0200, Zoran Bosnjak wrote:
can you please explain why does this simple program leak memory.
But, if I replace loop2 with loop1 (that is: without using "forever"), then it does not leak.
import Control.Concurrent import Control.Monad import Control.Monad.Trans import Control.Monad.Trans.Reader import Control.Monad.Trans.State
main :: IO () main = do --let loop1 = (liftIO $ threadDelay 1) >> loop1 let loop2 = forever (liftIO $ threadDelay 1)
_ <- runStateT (runReaderT loop2 'a') 'b' return ()
My results below. Looks like there's something wrong with *> for ReaderT and StateT. I get a stack overflow even with just _ <- runStateT loop () and just _ <- runReaderT loop () 8<--- import Control.Concurrent import Control.Monad import Control.Monad.Trans import Control.Monad.Trans.Reader import Control.Monad.Trans.State import Control.Applicative -- Fine forever0 a = let a' = a >> a' in a' -- Stack overflow forever1 a = let a' = a *> a' in a' -- Fine forever2 a = a >> forever2 a -- Stack overflow forever3 a = a *> forever3 a main :: IO () main = do let loop = forever3 (liftIO $ return ()) _ <- runStateT (runReaderT loop ()) () return ()