<p dir="ltr">Data.IntMap could be cleaned up some if single-field, single strict constructor GADTs/existentials could be unpacked even when wrapping a sum type. We could then have</p>
<p dir="ltr">data Status = E | NE<br>
data IntMap' (s :: Status) a where<br>
Bin :: ... -> ... -> !(IntMap' NE a) -> !(IntMap' NE a) -> IntMap' NE a<br>
Tip :: ... -> a -> IntMap' NE a<br>
Nil :: IntMap' E a<br>
data IntMap a =<br>
forall s . IM {-# UNPACK #-} !(IntMap' s a)</p>
<p dir="ltr">The representation would be the same as that of a newtype, but the pattern matching semantics would be strict. In the GADT case, this would essentially allow any fixed concrete datatype to serve directly as a witness for an arbitrary set of type equalities demanded on construction.</p>
<p dir="ltr">Is there any hope something like this could happen?</p>