Unlifted data types
Simon Peyton Jones
simonpj at microsoft.com
Mon Sep 7 21:55:09 UTC 2015
| I agree that we can't introduce a coercion between 'Force a' and
| 'a', for the reason you mentioned. (there's also a second reason which
| is that 'a ~R Force a' is not well-typed; 'a' and 'Force a' have
| different kinds.)
| I've imagined that we might be able to just continue representing
| Force explicitly in Core, and somehow "compile it away" at STG time,
| but I am definitely fuzzy about how this is supposed to work. Perhaps
| Force should not actually be a data type, and we should have
| 'force# :: a -> Force a' and 'unforce# :: Force a -> a' (the latter
| of which compiles to a no-op.)
I'm still doubtful. What is the problem you are trying to solve here? How does Force help us?
Note that a singleton unboxed tuple (# e #) has the effect of suspending; e.g.
f x = (# x+1 #)
return immediately, returning a pointer to a thunk for (x+1). I'm not sure if that is relevant.
More information about the ghc-devs