Haskell FFI-C结构数组数据字段

Haskell FFI-C结构数组数据字段,haskell,ffi,Haskell,Ffi,我正在为一个具有相当复杂接口的本机库开发haskell绑定。它有很多结构作为接口的一部分,我一直在用hsc2hs和bindingsdsl包为它们构建接口,以帮助实现结构绑定的自动化 不过,我遇到的一个问题是包含多维数组的结构。bindingsdl描述了用于绑定到以下结构的宏 struct with_array { char v[5]; struct test *array_pointer; struct test proper_array[10]; }; 使用类似宏的 #st

我正在为一个具有相当复杂接口的本机库开发haskell绑定。它有很多结构作为接口的一部分,我一直在用
hsc2hs
bindingsdsl
包为它们构建接口,以帮助实现结构绑定的自动化

不过,我遇到的一个问题是包含多维数组的结构。
bindingsdl
描述了用于绑定到以下结构的宏

struct with_array {
   char v[5];
   struct test *array_pointer;
   struct test proper_array[10];
};
使用类似宏的

#starttype struct with_array
#array_field v , CChar
#field array_pointer , Ptr <test>
#array_field proper_array , <test>
#stoptype
#array_字段
宏似乎只处理数组的第一个维度。是不是
绑定DSL
没有处理多维数组的宏

我非常希望使用宏将(可能是多维的)数组绑定到任意索引的
StorableArray
。似乎DSL提供的宏
bindings
中可以提供必要的信息-只是没有用于此的宏


是否有人将宏添加到
绑定DSL
?是否有人将此宏添加到
绑定DSL
?我是否已经过了使用hsc2hs应该做的事情,还有其他一些工具可以帮助我以更简洁的方式做我想做的事情呢?

好吧,没有人想出任何其他的方法,所以我会在我的评论中赞同这个想法。我将使用
#field
宏而不是
#array_field
宏,并指定一个包装
StorableArray
以正确工作的类型

因为我考虑了很多,所以我意识到可以使用GHC 7.6+支持的新类型级别编号来完全抽象包装器。我创建了一个名为的包,该包在类型级别上获取维度,并提供了一个适当的
可存储的
实例,用于处理本机数组,甚至多维数组

还有一件事我仍然不知道,我非常想知道,那就是找到一种方法来编写一个
bindingsdl
兼容的宏,自动提取维度并正确生成它们。尽管如此,只要看一眼绑定DSL中的宏,我就确信我自己还不知道如何管理它。

宏的
#array_字段
可以处理任何维度的数组。文档已经更新,以明确显示这一点

Haskell等效记录将是一个列表。当偷看和戳时,该列表元素的长度和顺序将对应于数组,因为它在C中被视为一维数组。因此,字段
int example[2][3]
将对应于一个列表,其中6个元素的顺序为
example[0][0]、example[0][1]、example[0][2]、example[1][0]、example[1][2]
。戳时,如果列表中有6个以上的元素,则只使用前6个元素


选择此设计是为了与FFI标准库中的peekArray和Pokerray保持一致。在
bindings DSL的1.0.17版本之前,有一个bug,当数组字段的维度大于1时,它会导致列表的大小被低估。

我想我可以创建一个新类型的wrapping
StorableArray
,其中有一个
Storable
实例专门用于该字段,只需使用
#字段
宏即可。在没有更好的解决方案的情况下,这似乎是明智的。
struct with_multidimensional_array {
   int whatever;
   struct something big_array[10][25][500];
};