First idea: instead of rejecting unpack pragmas on polymorphic fields, have them require a class constraint on the field types. Example:

 

    data UnboxPair a b = (Unbox a, Unbox b) => UP {-# UNPACK #-} !a {-# UNPACK #-} !b

 

The Unbox type class would be similar in spirit to the class with the same name in the vector package, but be implemented internally by GHC. To a first approximation instances would only exist for fields that unpack to non-pointer types (e.g. Int.)

 

Johan I don’t understand how this would work.   What methods does the class Unbox have?  What is the final representation of a UP constructor?  How many words?   Pointers or non-pointers?

 

At the moment each constructor has a fixed layout.

 

I’m really not sure what you have in mind here.  More detail needed!

 

Simon