What were you planning on doing with the "g" parameter?
Well, one thought would be to use some type class magicery to try to use this to ensure linearity, but I have no idea how to go about that. Another thing that had crossed my mind was to use unsafeInterleaveIO to generate an infinite list of random #s according to the IO function and store these in g and then just take 1 off the head at each call...I don't know whether this is safe or not, though.
AFAICT, unless you can get at c_gengam's state, you can't (safely) get the Haskell version out of the IO monad. OTOH, if you have a means to set the seed, you could combine the two into a pure function, and thus provide a pure (non-IO) Haskell interface. E.g. if you had:
Hrm. Getting at its state is really a bother and, while I probably could, it would make me a very unhappy camper.
[Although, in the second approach, I presume that you would need addtional code for multi-threaded use.]
I don't care about multi-threaded use. - Hal -- Hal Daume III | hdaume@isi.edu "Arrest this man, he talks in maths." | www.isi.edu/~hdaume