我对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
类实例通过peek
和poke
来封送数据。
有关示例,请参见前面的答案: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
包装器对此进行控制。