Converting to Foreign types
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? Thanks!
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
participants (2)
-
ROBERT DOUGLAS HOELZ -
Stefan O'Rear