如何声明对Haskell土地的回调

时间:2015-02-19 22:19:33

标签: haskell c2hs

我正在连接到C库,并且有一个功能 它的回调参数类型为(int (*fun) (void *))

我如何使用c2hs处理此问题?我没有看到提到的回调 https://github.com/haskell/c2hs/wiki/Implementation-of-Haskell-Binding-Moduleshttp://www.cse.unsw.edu.au/~chak/papers/Cha99b.html

在我的实际应用程序中,回调不进行任何计算 - 它只需要检查是否同时设置了某个标志,并且我想从Haskell线程设置它。 (所以显而易见的解决方法是在C land中声明回调和标志,并使用Haskell函数设置标志。)

(编辑)我还检查了https://wiki.haskell.org/Calling_Haskell_from_C但拒绝了它因为" ghc -c ...将创建Safe_stub.c ..."我确信编译到C早已不复存在。但实际上我得到了一个stub.h(我需要它吗?)和目标文件。

1 个答案:

答案 0 :(得分:2)

我不知道c2hs是否对此有任何特殊支持,但听起来你想要的是一个'外来导入'包装器''。请参阅Haskell 2010报告here中的“动态包装器”。

具体来说,如果你有

foreign import ccall "c_name" c_function_that_takes_a_callback ::
    FunPtr (Ptr Foo -> IO Int) -> IO () -- or whatever the whole type is

然后你想要

foreign import ccall "wrapper" makeFooWrapper ::
    (Ptr Foo -> IO Int) -> IO (FunPtr (PtrFoo -> IO Int))

然后,您可以将Haskell中的回调实现为函数Ptr Foo -> IO Int,将其传递给makeFooWrapper,然后将结果传递给c_function_that_takes_a_callback