我想从 C/C++ 调用 Haskell 函数。我已经阅读了一些与该主题相关的教程,但是其中没有涉及 IO monad 调用。特别是,我想调用一个使用 interact
函数的函数 (interact::(String -> String) -> IO ()
)。
- 我不明白在这种情况下如何使用函数?
- 如何在 C/C++ 包装器中声明函数?
- 如何在 C/C++ 和 Haskell 之间转移标准输入/输出的控制(在 C/C++ 代码中)?
最佳答案
我将让这个答案相对简短,因为大部分内容都包含在 FFI documentation 中。 .
您可以通过在 C 中按名称调用函数来使用它们。函数必须声明为 foreign export
并且它与 foreign import
语法相似,用于调用定义在Haskell 中的一个 C 模块。在 C 语言中,您需要将函数声明为 extern
并为其提供普通类型签名。
您的 interact
函数不能直接声明,因为它引用了未在 C 中定义的类型。您可以定义并编写调用 interact
的相关函数 haskell :
interact_hs :: FunPtr (CString -> CString) -> IO ()
此函数然后必须使用其参数(带包装)来调用 interact
。
在 C 中,此函数显示为:
extern void interact_hs(char*(*f)(char*));
或者类似的东西,我的函数指针语法生锈了。
要从 C 实际调用此函数,您需要初始化 Haskell 运行时(在文档中介绍),然后调用该函数,此时执行控制权将传递给 Haskell。一旦函数完成并返回,执行的控制权就会返回到 C。
与 FFI 合作的其他有用资源:
- GHC documentation
- 真实世界 Haskell 的 chapter在 FFI 上
- Edward Z. Yang 的 blog post series在 FFI 和 c2hs 预处理器上
请随意推荐其他有用的链接!
关于c++ - Haskell IO monad 的 C/C++ 包装器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23241587/