Wadler space leak
Simon Marlow
marlowsd at gmail.com
Mon Nov 1 05:38:43 EDT 2010
On 28/10/2010 14:21, Bertram Felgenhauer wrote:
> Hi,
>
>> let (first,rest) = break (const False) input
>> in
>> print (length (first ++ rest))
>>
>> When I compile this program using -O2 and use a large text file as
>> input the code runs in constant space. If I understand correctly,
>> the program runs in constant space because ghc uses an optimization
>> similar to the one proposed by Wadler/Sparud.
>
> Right. The optimization works by producing special thunks for tuple
> selectors which the garbage collector can recognize and evaluate
> during GC.
>
> However the implementation in GHC is quite brittle. See
>
> http://hackage.haskell.org/trac/ghc/ticket/2607
>
> I suspect your program is another instance of this behaviour.
>
>> If I define the following function which is based on break
>>
>> splitBy :: (a -> Bool) -> [a] -> [[a]]
>> splitBy _ [] = []
>> splitBy p xs =
>> l : case ys of
>> [] -> []
>> _:zs -> splitBy' p zs
>> where
>> (l,ys) = break p xs
>
> I haven't looked in detail; what follows is a guess of what
> ghc may be doing. It could be verified by looking at the
> generated core.
>
> The where-binding desugars to something like
>
> let q = break p xs
> ys = case q of (_, ys) -> ys
> l = case q of (l, _) -> l
> in ...
>
> ys can be inlined into splitBy, producing
>
> l : case (case q of (l, ys) -> ys) of
> [] -> []
> _:zs -> splitBy' p zs
>
> l : case q of (l, ys) -> case ys of
> [] -> []
> _:zs -> splitBy' p zs
>
> and now the tuple selector is no longer recognizable.
Yes, that's exactly what happens.
Cheers,
Simon
More information about the Glasgow-haskell-users
mailing list