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

Jea*_*ouX 2 c binding haskell ffi storable

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

data MyType a =
        TypeDouble Double
      | TypeLst [a] 
      | TypeAdd (MyType a) (MyType a) 
Run Code Online (Sandbox Code Playgroud)

我开始定义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
Run Code Online (Sandbox Code Playgroud)

编译得很好,但我不知道如何实现peekpoke功能.我认为实现这些函数的方式与此答案相同,但只有当列表中的所有元素具有相同的大小(此处不是这种情况)时,此实现才起作用.

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

HTN*_*TNW 7

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