Передача void * через haskell

Я работаю над библиотекой C (libpandoc), которая использует некоторую работу с библиотекой haskell (pandoc). Библиотека C предоставляет обратные вызовы оболочки haskell для чтения и записи данных. Обычно с обратными вызовами я также хотел бы отправить void *user_data, чтобы обратные вызовы не должны были зависеть от глобальных переменных.

Однако в Интернете я не могу понять, как передать переменную Haskell a void *.

Существует CString, который является char * (и может в конечном итоге использоваться как обходной путь, но это не так приятно) и общий Ptr, который делает указатели из вещей. Однако эти вещи, похоже, не включают void (что также понятно). Глядя на Foreign.C Я не вижу ничего полезного.

Мой вопрос: какой тип я могу использовать для передачи такой функции в Haskell?

int func(char *buffer, void *user_data);

...

that_haskell_function(..., func, my_data);

Ответы

Ответ 1

Любой тип указателя вообще должен работать, я думаю, но Ptr () имеет наибольший смысл.

{-# LANGUAGE ForeignFunctionInterface #-}
import Foreign
import Numeric

foreign import ccall unsafe "foo"
    c_foo :: Ptr () -> IO ()

main :: IO ()
main =
    allocaBytes 8 $ \ptr -> do
        c_foo ptr
        x <- peek (castPtr ptr) :: IO Word64
        putStrLn (showHex x "")

И файл C:

#include <string.h>

void foo(void *ptr)
{
    memset(ptr, 0xEB, 8);
}

Дает результат:

ebebebebebebebeb