如何为递归类型创建 Storable 实例?
How do I create a Storable instance for a recursive type?
我在 Haskell 模块中有以下数据类型,我想编写一个可存储实例以通过 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
编译得很好,但是我不知道如何实现peek
和poke
函数。我认为以与 中相同的方式实现这些功能,但只有当列表中的所有元素都具有相同的大小时,此实现才有效,而这里不是这种情况。
对于元素具有浮动大小的递归类型,实现 peek
和 poke
函数的正确方法是什么?
你不能为此 Storable
。这些数据类型需要有固定的大小,就像 C struct
s 一样。另外,请注意 sizeof
不应该检查您给它的值。它只是类型参数的 proxy/carrier ,因此您可以编写例如sizeof (undefined::Int)
。也许看看 Foreign.Marshal.Array
我在 Haskell 模块中有以下数据类型,我想编写一个可存储实例以通过 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
编译得很好,但是我不知道如何实现peek
和poke
函数。我认为以与
对于元素具有浮动大小的递归类型,实现 peek
和 poke
函数的正确方法是什么?
你不能为此 Storable
。这些数据类型需要有固定的大小,就像 C struct
s 一样。另外,请注意 sizeof
不应该检查您给它的值。它只是类型参数的 proxy/carrier ,因此您可以编写例如sizeof (undefined::Int)
。也许看看 Foreign.Marshal.Array