c - 如何为递归类型创建 Storable 实例?

标签 c haskell binding ffi storable

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

它编译得很好,但我不知道如何实现 peekpoke 功能。我认为以与 this answer 中相同的方式实现这些功能但只有当列表中的所有元素都具有相同的大小时,此实现才有效,而这里不是这种情况。

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

最佳答案

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

关于c - 如何为递归类型创建 Storable 实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46799237/

相关文章:

haskell - “replace equals by equals” 是什么意思

haskell - 如何使用具有不同键类型的 IntMap?

c# - ICommand - RelayCommand CanExecute 方法不更新按钮 IsEnabled 属性

c++ - 函数导致巨大的内存泄漏?

C程序列出隐藏文件和只读文件

c - Backtrace 在 Linux x86_64 上如何工作?

haskell - JSONify 持久化模型 *包括* id

binding - jQuery 日期选择器在 AJAX 之后不持久

objective-c - 将启用的 NSButton 绑定(bind)到 NSTextView 中的选择

c - 输入和输出重定向