当然答案是以某种方式传递/接受连续的内存块,所以问题更多的是关于如何做到这一点.现在我仍然可以通过在C端编写包装函数来避免这个问题,但这并不是一个永久的解决方案.
Don*_*art 12
FFI不支持任意传递值Haskell可存储类型.
您只能传递类型的值(其中一些是指针):
Int#, Word#,
Char#,
Float#, Double#,
Addr#,
StablePtr# a, MutableByteArray#, ForeignObj#, and ByteArray#.
Run Code Online (Sandbox Code Playgroud)
因此,要传递结构,必须通过C包装器包装调用; 它接受一个指针并将其值传递给您希望实际调用的C函数.
最近的GHC扩展允许"primop"导入 - 它绕过FFI机制并支持任意调用约定并通过未装箱的元组传递结构.例如
foreign import prim "ITCHv41_run"
parseITCHv41# :: Addr# -> Word#
-> (# Int#, Word#, Word#, Word#, Word#, Word# #)
Run Code Online (Sandbox Code Playgroud)
你可以使用它们做这样棘手的低级别的东西.