| > 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

Reply via email to