Использование Haskell FFI для построения структур; также, как использовать FunPtr - PullRequest
4 голосов
/ 05 июня 2011

У меня есть несколько вопросов о ffi в haskell.

. Прежде всего, я пытаюсь работать со структурами c в haskell.

. У меня есть несколько вопросов:у меня есть структура, подобная

struct foo{int a; float b;};
  1. , когда я могу использовать data Foo = Foo { a :: Int, b :: Float } deriving (Show, Eq)
  2. , когда мне нужно реализовать хранимое с peek и poke?

хорошо, теперь вопрос о FunPtr

  • Я не знаю, когда использовать FunPtr, почему обычного определения, такого как Ptr CInt -> IO CInt, недостаточно?

1 Ответ

8 голосов
/ 05 июня 2011

Marshalling

Чтобы упорядочить структуры, вам потребуется , необходимо использовать экземпляр класса Storable для перенаправления данных назад и вперед через peek и poke.

См. Этот предыдущий ответ для примера: Как использовать hsc2hs для привязки к константам, функциям и структурам данных?


FunPtr

FunPtr требуется только в том случае, если вы хотите передать функцию через границу FFI в качестве первоклассного значения, не для вызова сторонних функций.Точно:

Значение типа FunPtr a является указателем на функцию, вызываемую из стороннего кода.Тип a обычно будет сторонним типом, типом функции с нулевым или большим числом аргументов

Пример регистрации функции обратного вызова:

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

Поскольку мы должны передатьp_free сама функция Haskell, мы должны сообщить Haskell, что это на самом деле функция C.Оболочка FunPtr контролирует это.

...