I have the following data type in a Haskell module and I would like to write a Storable instace to use it with C via FFI :
data MyType a =
TypeDouble Double
| TypeLst [a]
| TypeAdd (MyType a) (MyType a)
I began by defining the sizeOf function :
instance Storable a => Storable (MyType a) where
sizeOf (TypeDouble _) = sizeOf (0 :: Double)
sizeOf (TypeLst lst) = sum $ map sizeOf lst
sizeOf (TypeAdd a b) = sizeOf a + sizeOf b
It compile well, but I don't know how to implement the peek and poke functions. I thought implementing these functions the same way as in this answer but this implementation work only if all the elements in the list have the same size which is not the case here.
What is the correct way to implement peek and poke functions for a recursive type where elements have a floating size ?
You can’t have a
Storablefor this. These datatypes need to have a fixed size, just like Cstructs. Also, note thatsizeofisn’t supposed to inspect the value you give it. It’s just a proxy/carrier for the type argument, so you can write e.g.sizeof (undefined::Int). Maybe take a look atForeign.Marshal.Array