On Sun, Feb 20, 2011 at 9:38 AM, tsuraan <[email protected]> wrote: > I have a streaming network protocol where each message in the stream > is prefixed by a 64-bit message length marker. Lazy ByteStrings seem > to be an elegant way to wrap network communications, so I'm using > them. I have one concern though: how can I prevent my program from > hanging on to the beginning of the stream? My code looks roughly like > this: > > lazy <- getContents clientSock > let (lenBS, rest1) = splitAt 8 lazy > let length = runGet getWord64be lenBS > let (msg, rest2) = splitAt (fromIntegral length) rest1 > -- process msg > > The program never uses that initial "lazy" again, but it's there, and > it's been assigned, so I assume that reference to the head of the > stream will always be around, and thus always consuming memory. Is > there a way to indicate to haskell that I want to "forget" about that > assignment, so the runtime doesn't need to keep the stream around? In > this case, I think I could do the stream processing in a > tail-recursive loop, and thus lose the previous references to the > stream, but is there a more specific way to tell haskell that I'm done > with some data?
One easy trick is to put the rest of the function body in a separate top-level function, so that the 'lazy' variable is no longer in scope. Antoine > > _______________________________________________ > Haskell-Cafe mailing list > [email protected] > http://www.haskell.org/mailman/listinfo/haskell-cafe > _______________________________________________ Haskell-Cafe mailing list [email protected] http://www.haskell.org/mailman/listinfo/haskell-cafe
