
On Tue, Jun 19, 2018, 9:54 PM Dr.Koster
In general infinite monadic recursion will leak, since the tail position is always >> or >>= instead of your own recursive function
That seems a bit strong. Monadic recursion *can* leak, but it need not. >>= is typically lazy in its second argument, so it can produce structure lazily. Consider the free monad, for example: data Free f a = Pure a | Wrap (f (Free f a)) instance Functor f => Monad (Free f) where Pure a >>= f = f a Wrap ff >>= f = Wrap $ fmap (>>= f) ff See how we can produce Wrap without using f? As long as the base functor isn't too large, this shouldn't leak. , but under certain situations, e.g. IO without arguments, the compiler
will figure there's no need to push new stack frame. But anyway it's better to checkout yourself rather relying on some weak assumptions.
发自我的iPhone
------------------ Original ------------------ *From:* Никита Фуфаев
*Date:* Wed,Jun 20,2018 2:37 AM *To:* haskell-cafe *Subject:* Re: [Haskell-cafe] Memory leak in infinite recursion Hello everyone
In C you can't implement main loop with recursion like void mainLoop() { doSomething(); mainLoop(); } because without optimisations stack will overflow. In haskell it's common to write mainLoop = doSomething >> mainLoop, and it doesn't leak memory because of haskell's evaluation model. Does memory leak or argument stack overflow happen in this case? mainLoop = doSomething >> mainLoop >> exit ExitSuccess What about this case? mainLoopModeA = do doSomething when condition mainLoopModeB mainLoopModeA mainLoopModeB = do doSomethingElse when anotherCondition mainLoopModeA mainLoopModeB
or this case? mainLoopModeA = do doSomething if condition then mainLoopModeB else mainLoopModeA mainLoopModeB = do doSomethingElse if anotherCondition then mainLoopModeA else mainLoopModeB
-- Nikita Fufaev _______________________________________________ Haskell-Cafe mailing list To (un)subscribe, modify options or view archives go to: http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe Only members subscribed via the mailman list are allowed to post.