Function 通过Haskell FFI将自定义数据结构传递给C

Function 通过Haskell FFI将自定义数据结构传递给C,function,haskell,types,ffi,Function,Haskell,Types,Ffi,如果我有一个C函数,看起来像这样 void print\u addr(结构sockaddr\u rc addr){ //一些印刷机械 } 如果我在Haskell中定义了一个类似于struct sockaddr\u rc的数据结构,并为它实现了一个Storable实例,那么这足以定义这样的外部函数吗 foreign import ccall "print_addr" print_addr :: RFSocketAddress -> IO () 我理解是这样的,但我得到

如果我有一个C函数,看起来像这样

void print\u addr(结构sockaddr\u rc addr){
//一些印刷机械
}
如果我在Haskell中定义了一个类似于
struct sockaddr\u rc
的数据结构,并为它实现了一个
Storable
实例,那么这足以定义这样的外部函数吗

foreign import ccall "print_addr" print_addr :: RFSocketAddress -> IO ()

我理解是这样的,但我得到一个错误,告诉我在foreign声明中有一个不可接受的参数,因为
RFSocketAddress
无法封送。

这在结构上有一个选项。这有帮助吗?@g_bor我看了一会儿,似乎没有。它们展示了一些使用hsc2hs的示例。我不记得了,但我查看了我的旧代码,我发现我总是使用
Ptr
来存储数据结构。是不是
Ptr RFSocketAddress
?@Stéphanelant我也在考虑这个问题。我推断我可以调用具有普通C整数作为参数的C函数,而不是指向C整数的指针。只要我对GHC有足够的指导,我应该能够对任何类型执行相同的操作?我记得GHC(或者更确切地说是Haskell 2010)不允许在FFI函数中使用“可封送类型”以外的类型作为参数类型。可封送编组类型包括指针,但不包括(尚未?)结构,即使是
可存储的
实例。