On Sat, Feb 17, 2007 at 05:58:49PM -0600, ROBERT DOUGLAS HOELZ wrote: > Hello, > > I want to convert a Haskell Integer (Data.Int.Int32) to a C long > (Foreign.C.Types.CLong), but it seems this code here doesn't work: > > intToLong :: Int32 -> Clong > intToLong num = > let maybelong = cast num > in if isNothing maybelong > then > 0 > else > fromJust maybeLong > > (It always returns 0) > > Could anyone give me a hint as to what the problem is?
cast has very limited abilities - it only converts if the types are exactly the same, otherwise it returns Nothing. In Haskell, Int32 and CLong are not the same type even if they happen to be the same size; this helps with portability, unlike C where code that assumes int32_t == long will work flawlessly until it is run on a 64-bit computer. You probably want to use Prelude.fromIntegral: fromIntegral :: (Integral a, Num b) => a -> b which converts between numeric types, with all the usual perils. (e.g (fromIntegral :: Int -> Word8) 256 == 0) Stefan _______________________________________________ Haskell mailing list [email protected] http://www.haskell.org/mailman/listinfo/haskell
