I don't want to use the GL types directly since the OpenGL renderer is not exposes in the rest of the API.

I was hoping that realToFrac would be a nop in case it would be identical to an unsafeCoerce.

I guess one could make rules for that, but this tickets makes me wander if that really works:
http://hackage.haskell.org/trac/ghc/ticket/1434



On Wed, Sep 30, 2009 at 4:58 PM, Roel van Dijk <vandijk.roel@gmail.com> wrote:
If you are *really* sure that the runtime representation is the same
you could use usafeCoerce. You could use a small test function for
profiling, something like:

convertGLfloat :: GLfloat -> Float
convertGLFloat = realToFrac
-- convertGLFloat = unsafeCoerce

and toggle between the two (assuming you won't get a segmentation fault).

Another option is to not convert at all but use the GL types
everywhere. Either explicitly or by exploiting polymorphism.