我对haskell
中的ffi有一些疑问。
首先,我正在尝试使用haskell
中的c结构。
我有一些问题:我有一个像
这样的结构struct foo{int a; float b;};
data Foo = Foo { a :: Int, b :: Float } deriving (Show, Eq)
现在关于FunPtr
FunPtr
为什么像Ptr CInt -> IO CInt
这样的正常定义还不够?答案 0 :(得分:8)
编组
要编组结构,将需要使用Storable
类实例来通过peek
和poke
来回传输数据。
有关示例,请参阅此前一个答案:How to use hsc2hs to bind to constants, functions and data structures?
FunPtr
仅当您希望将函数作为第一类值传递给FFI边界时,才需要 FunPtr
,不用于调用外部函数。确切地说:
FunPtr类型的值是指向可从外部代码调用的函数的指针。类型a通常是外来类型,具有零个或多个参数的函数类型
一个例子,注册一个回调函数:
foreign import ccall "stdlib.h &free"
p_free :: FunPtr (Ptr a -> IO ())
由于我们必须将p_free
本身传递给Haskell函数,我们必须让Haskell知道这实际上是一个C函数。 FunPtr
包装器控制着。