如何声明回调到 Haskell 土地

how to declare a callback to Haskell land

我正在连接到 C 库,并且有一个函数 具有 (int (*fun) (void *)).

类型的回调参数

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

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

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

我不知道c2hs有没有特别支持这个,但听起来你想要的是一个'foreign import "wrapper"'。请参阅 Haskell 2010 年报告 here 中的 "Dynamic wrapper"。

具体来说,如果您有

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