Note [RuntimeRep polymorphism]
Generally speaking, you can't be polymorphic in `RuntimeRep`. E.g
f :: forall (rr::RuntimeRep) (a::TYPE rr). a -> [a]
f = /\(rr::RuntimeRep) (a::rr) \(a::rr). ...
This is no good: we could not generate code for 'f', because the
calling convention for 'f' varies depending on whether the argument is
a a Int, Int#, or Float#. (You could imagine generating specialised
code, one for each instantiation of 'rr', but we don't do that.)
Certain functions CAN be runtime-rep-polymorphic, because the code
generator never has to manipulate a value of type 'a :: TYPE rr'.
* error :: forall (rr::RuntimeRep) (a::TYPE rr). String -> a
Code generator never has to manipulate the return value.
* unsafeCoerce#, defined in Desugar.mkUnsafeCoercePair:
Always inlined to be a no-op
unsafeCoerce# :: forall (r1 :: RuntimeRep) (r2 :: RuntimeRep)
(a :: TYPE r1) (b :: TYPE r2).
a -> b
* Unboxed tuples, and unboxed sums, defined in GHC.Builtin.Types
Always inlined, and hence specialised to the call site
(#,#) :: forall (r1 :: RuntimeRep) (r2 :: RuntimeRep)
(a :: TYPE r1) (b :: TYPE r2).
a -> b -> TYPE ('TupleRep '[r1, r2]) References 0
This Note does not link to any other.
Referenced by 1
- TYPE and CONSTRAINT] aka Note [Type vs Constraint GHC.Builtin.Types.Prim