ANNOUNCE: protocol-buffers-0.2.9 for Haskell is ready

Chris Kuklewicz haskell at
Mon Sep 22 06:48:16 EDT 2008

I am cross-posting this message to several lists.

I had learned the trick before the documentation was updated.  It seems I have 
used a very unreliable trick.  And the "use castToSTUArray" suggested 
alternative is a really poor one since I am not using arrays at all.

Who can suggest a way to cast from Float to Word32 and Double to Word64 using 
ghc?  The actual task is that I need to write out the Float as a little endian 
sequence of four bytes and also be able to read it back in.  The writing and 
reading are done in Put and Get monads to ByteString (from the "binary" package).

The alloca/poke/peek work around I have looks like
castWord32ToFloat :: Word32 -> Float
castWord32ToFloat x = unsafePerformIO $
   alloca $ \p -> poke p x >> peek (castPtr p)

castFloatToWord32 :: Float -> Word32
castFloatToWord32 x = unsafePerformIO $
   alloca $ \p -> poke p x >> peek (castPtr p)

The unsafeCoerce trick that is no longer working looks like:
castWord64ToDouble :: Word64 -> Double
castWord64ToDouble (W64# w) = D# (unsafeCoerce# w)

castDoubleToWord64 :: Double -> Word64
castDoubleToWord64 (D# d) = W64# (unsafeCoerce# d)

Any ideas? Or is the alloca trick the only way to do this?


Ian Lynagh wrote:
> Hi Chris,
> On Sun, Sep 21, 2008 at 05:37:33PM +0100, Chris Kuklewicz wrote:
>> Also, I tried two tricks:
>> (D# x) <-> (W64# x) which works fine
>> (F# x) <-> (W32# x) which produced garbage, so I had to replace it with 
>> alloca/poke/peek.
> This isn't supported, and I suspect is the cause of the -fasm problems.
> Please see
> for more details and suggested alternative.
> Thanks
> Ian

More information about the Libraries mailing list