我对haskell中的ffi有一些疑问。

首先,我尝试使用haskell中的c结构。

那里我有一些问题:我有一个像

struct foo{int a; float b;};



我什么时候可以使用data Foo = Foo { a :: Int, b :: Float } deriving (Show, Eq)
什么时候我必须用peek and poke实现一个可存储的?


好的,现在有关FunPtr的问题


我不知道何时使用FunPtr为什么像Ptr CInt -> IO CInt这样的普通定义还不够?

最佳答案

编组

要封送结构,您将需要使用Storable类实例通过peekpoke来封送数据。

有关示例,请参见前面的答案:How to use hsc2hs to bind to constants, functions and data structures?



FunPtr

仅当您想跨FFI边界传递函数作为一等值时才需要FunPtr,而不是用于调用外部函数。恰恰:


FunPtr a类型的值是指向可从外部代码调用的函数的指针。类型a通常是外来类型,是具有零个或多个参数的函数类型


注册回调函数的示例:

foreign import ccall "stdlib.h &free"
   p_free :: FunPtr (Ptr a -> IO ())


由于必须将p_free本身传递给Haskell函数,因此必须让Haskell知道这实际上是C函数。 FunPtr包装器对此进行控制。

10-06 07:27