I don't want to use the GL types directly since the OpenGL renderer is not exposes in the rest of the API.
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.