使用Haskell FFI编组结构;另外,如何使用FunPtr

时间:2011-06-05 15:23:36

标签: haskell ffi

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

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

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

这样的结构
struct foo{int a; float b;};
  1. 我什么时候可以使用data Foo = Foo { a :: Int, b :: Float } deriving (Show, Eq)
  2. 当我必须实施一个可以偷看和戳戳?
  3. 现在关于FunPtr

    的问题
    • 我不知道何时使用FunPtr为什么像Ptr CInt -> IO CInt这样的正常定义还不够?

1 个答案:

答案 0 :(得分:8)

编组

要编组结构,需要使用Storable类实例来通过peekpoke来回传输数据。

有关示例,请参阅此前一个答案: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包装器控制着。