[Haskell-cafe] Memory leak in infinite recursion
winter
drkoster at qq.com
Wed Jun 20 11:56:39 UTC 2018
Well, Yes, If the consumer side consume the result properly (not getting
in the way of GC), a space leak could be avoided.
On 2018年06月20日 18:54, David Feuer wrote:
> On Tue, Jun 19, 2018, 9:54 PM Dr.Koster <drkoster at qq.com
> <mailto:drkoster at qq.com>> wrote:
>
> 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:* Никита Фуфаев <kitttoran at gmail.com
> <mailto:kitttoran at gmail.com>>
> *Date:* Wed,Jun 20,2018 2:37 AM
> *To:* haskell-cafe <haskell-cafe at haskell.org
> <mailto:haskell-cafe at haskell.org>>
> *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.
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/haskell-cafe/attachments/20180620/3f66ebff/attachment.html>
More information about the Haskell-Cafe
mailing list