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
контролирует это.