关于C#:如何为递归类型创建Storable实例?

How do I create a Storable instance for a recursive type?

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

1
2
3
4
data MyType a =
        TypeDouble Double
      | TypeLst [a]
      | TypeAdd (MyType a) (MyType a)

我首先定义了sizeOf函数:

1
2
3
4
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。这些数据类型需要具有固定的大小,就像C struct s一样。另外,请注意,sizeof不应检查您提供的值。它只是type参数的代理/载体,因此您可以编写例如sizeof (undefined::Int)。也许看看Foreign.Marshal.Array