
On Friday 03 September 2010 12:28:43, Jan Christiansen wrote:
Hi,
On 03.09.2010, at 01:32, Daniel Fischer wrote:
No surprise, there aren't many 'รค's in Shakespeare's works, are there?
nope
On the other hand, the current implementation of lines does not seem to suffer from Wadler's tuple space leak (according to one test I made), so I'd stick with the current implementation for the time being.
Well, I think it does.
Indeed. I botched my test, allowing it to drop the reference to the first line too early by not using enough of it, so although lines shows the leak, let { ds1_s1ts :: ([Char], [Char]) LclId ds1_s1ts = case $wbreak @ Char lvl_r1uj wild_B1 of _ { (# ww1_anp, ww2_anq #) -> (ww1_anp, ww2_anq) } } in : @ String (case ds1_s1ts of _ { (l_aij, _) -> l_aij }) (case ds1_s1ts of _ { (_, s'_ail) -> case s'_ail of _ { , I managed to conceal it.
But obviously one can argue that this is a rare application.
Yes. Ordinarily, lines in text files aren't longer than a few hundred characters, leaking those, who cares? But. Occasionally, long lines occur, and avoiding the space leak seems more important to me than having lines (_|_ : _|_) = _|_ : _|_ instead of lines (_|_ : _|_) = _|_
Hopefully I haven't made a mistake here?
No.
By accident I stumbled across an odd behaviour. If I use the following definition and replace all occurrences of break by break' in the program above the memory behaviour is bad if I compile it without profiling. But if I compile the program with -prof -auto-all the program runs in constant space. Is this a known behaviour?
I can't reproduce that. For me, it leaks also with profiling.
break' :: (a -> Bool) -> [a] -> ([a],[a]) break' p xs = (ys,zs) where (ys,zs) = break p xs
Cheers, Jan