c-如何为递归类型创建可存储实例



我在Haskell模块中有以下数据类型,我想写一个Storable实例,通过FFI将其与C一起使用:

data MyType a =
TypeDouble Double
| TypeLst [a] 
| TypeAdd (MyType a) (MyType a) 

我首先定义了sizeOf函数:

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

它编译得很好,但我不知道如何实现peekpoke函数。我认为实现这些功能的方式与这个答案中的相同,但只有当列表中的所有元素都具有相同的大小时,这个实现才能工作,而这里的情况并非如此。

对于元素具有浮动大小的递归类型,实现peekpoke函数的正确方法是什么

不能有Storable。这些数据类型需要有一个固定的大小,就像Cstructs一样。此外,请注意,sizeof不应该检查你给它的值。它只是类型参数的代理/载体,所以你可以编写例如sizeof (undefined::Int)。也许可以看看Foreign.Marshal.Array

最新更新