
On Fri, Sep 4, 2015 at 5:23 PM, Edward Z. Yang
But this kind of special handling is a bit bothersome. Consider:
data SPair a b = SPair (!a, !b)
The constructor has what type? Probably
SPair :: (Force a, Force b) -> SPair a
and not:
SPair :: (a, b) -> SPair a
I don't really understand what this example is showing. I don't think SPair is a legal declaration in any scenario. - In current Haskell it's illegal; you can only put ! directly on fields - If !a :: Unlifted, then (,) (!a) is a kind error (same with Force a)
I don't think it interacts any differently than with unpacked/unboxed products today.
I meant like: If T :: Unlifted, then am I allowed to do: data U = MkU {-# UNPACK #-} T ... and what are its semantics? If T is a sum, presumably it's related to the unpacked sums proposal from a couple days ago. Does stuff from this proposal make that proposal simpler? Should they reference things in one another? Will there be optimizations that turn: data E a b :: Unlifted where L :: a -> E a b R :: b -> E a b into |# a , b #| (or whatever the agreed upon syntax is)? Presumably yes. -- Dan