Ответ 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# #)
Вы можете использовать их для сложных статей низкого уровня, как это.