如何声明对Haskell-land的回调



我正在连接一个C库,并且有一个函数其具有类型为CCD_ 1的回调参数。

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

在我的实际应用程序中,回调不进行任何计算——它只需要检查是否同时设置了一些标志,我想从Haskell线程设置它。(因此,显而易见的解决方案是在C语言中声明回调和标志,并使用Haskell函数设置标志。)

(编辑)我也检查了https://wiki.haskell.org/Calling_Haskell_from_C但拒绝了它,因为"ghc-c…将创建Safe_stub.c…",我确信编译到c已经很久了。但事实上,我得到了一个存根.h(我需要它吗?)和对象文件。

我不知道c2hs是否对此有任何特殊的支持,但听起来你想要的是一个"foreign import"wrapper"。请参阅Haskell 2010报告中的"动态包装器"。

具体来说,如果你有

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

最新更新