通过haskell传递void *

时间:2013-06-28 14:16:27

标签: c haskell

我正在使用一个使用haskell库(pandoc)来完成某项工作的C库(libpandoc)。 C库为haskell包装器回调提供读写数据。典型的回调,我还想发送void *user_data,以便回调不必依赖于全局变量。

但是,在互联网上搜索,我似乎无法弄清楚如何将Haskell传递给void *变量。

CString是一个char *(并且最终可以用作变通方法,但它并不是那么好)和通用Ptr,它可以指出事物。但是,这些事情似乎不包括void(这也是可以理解的)。看Foreign.C我看不到任何有用的东西。

我的问题是,我可以用什么类型将这样的函数传递给Haskell?

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

...

that_haskell_function(..., func, my_data);

1 个答案:

答案 0 :(得分:19)

我认为任何指针类型都应该有效,但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