Конечно, ответ заключается в том, чтобы каким-то образом передать/принять непрерывный блок памяти, поэтому вопрос заключается в том, как это сделать. На данный момент я все еще мог избежать этой проблемы, написав функции обертки на стороне C, но это не так много из решения по управлению.
Haskell FFI - Как обрабатывать функции 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# #)
Вы можете использовать их для сложных статей низкого уровня, как это.