Haskell FFI - Как обрабатывать функции C, которые принимают или возвращают структуры вместо указателей на структуры?

Конечно, ответ заключается в том, чтобы каким-то образом передать/принять непрерывный блок памяти, поэтому вопрос заключается в том, как это сделать. На данный момент я все еще мог избежать этой проблемы, написав функции обертки на стороне C, но это не так много из решения по управлению.

Ответ 1

FFI не поддерживает произвольный проход по значениям сохраняемых типов Haskell.

Вы можете передавать только значения типа (и некоторые из них являются указателями):

Int#, Word#,
Char#,
Float#, Double#,
Addr#,
StablePtr# a, MutableByteArray#, ForeignObj#, and ByteArray#.

Итак, чтобы передать структуру, вы должны обернуть вызов с помощью оболочки C; который берет указатель и передает его значение функции C, которую вы хотите вызвать.

Последнее расширение GHC позволяет импортировать "primop", которые обходят механизм FFI и поддерживают условные условные вызовы и передают структуры через unboxed кортежи. Например.

foreign import prim "ITCHv41_run"
  parseITCHv41# :: Addr# -> Word#
                -> (# Int#, Word#, Word#, Word#, Word#, Word# #)

Вы можете использовать их для сложных статей низкого уровня, как это.