2

我在 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

它编译得很好,但我不知道如何实现peekandpoke函数。我认为以与此答案相同的方式实现这些功能,但此实现仅在列表中的所有元素具有相同大小的情况下才有效,而此处并非如此。

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

4

1 回答 1

7

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

于 2017-10-17T21:36:31.507 回答