| > You'll probably end up with a link error, because there is no curried
function (#,#). With a regular data
| type, we inject the (rather odd-looking) function
| > (,) = \a \b. (a,b)
| > and similarly for all data type declarations, just so that there is a
current (,) function defined.
|
| looks like a good point. Although many examples such as yours fail to be
| kind-correct.
Ah yes, it would indeed be difficult to compile a single curried function for
(#,#), because it can take unboxed arguments of any width.
Ah... I've discovered that unboxed tuples are eta-expanded by CorePrep, like
primops, because they have no binding. Here's the relevant function from
Id.lhs, which is used in corePrep.
Hmm. I wonder if this means we don't need PrimopWrappers? Or, equivalently,
it means that we can return False for PrimOpId in hasNoBinding?
Simon
-- hasNoBinding returns True of an Id which may not have a
-- binding, even though it is defined in this module.
-- Data constructor workers used to be things of this kind, but
-- they aren't any more. Instead, we inject a binding for
-- them at the CorePrep stage.
-- EXCEPT: unboxed tuples, which definitely have no binding
hasNoBinding id = case globalIdDetails id of
PrimOpId _ -> True
FCallId _ -> True
DataConWorkId dc -> isUnboxedTupleCon dc
other -> False
_______________________________________________
Cvs-ghc mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/cvs-ghc