[Haskell-cafe] Unexpected result from Data.Compact.inCompact?

Bertram Felgenhauer bertram.felgenhauer at googlemail.com
Wed Jun 26 16:08:26 UTC 2019


Viktor Dukhovni wrote:
> I am seeing surprising results from 'inCompact' after 'compact'.
> It seems there are additional limitations on what can be compacted,
> with 'compact' not throwing a 'CompactionFailed' exception in some
> cases, and yet not compacting the value.  Is this expected?

This seems to be a documentation problem. `compact` forces and copies
/most/ of the data, but there are some exceptions:

- data that is already compacted is not copied
  (this does not happen in your example, I think)
- statically allocated data is not copied either.
  This includes nullary constructors like (), [], or
  Data.Map.Internal.Tip (the empty map) as well as many statically
  known values like 42 :: Int

See also shouldCompact(),
  https://github.com/ghc/ghc/blob/master/rts/sm/CNF.c#L615

which is called several times in stg_compactAddWorkerzh,
  https://github.com/ghc/ghc/blob/master/rts/Compact.cmm#L50

Cheers,

Bertram


More information about the Haskell-Cafe mailing list