c++ - Haskell IO monad 的 C/C++ 包装器

标签 c++ haskell linker monads static-linking

我想从 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 合作的其他有用资源:

请随意推荐其他有用的链接!

关于c++ - Haskell IO monad 的 C/C++ 包装器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23241587/

相关文章:

haskell - 如何在没有堆栈的情况下运行 shake

validation - 处理 CLI 参数语义错误的编程模式或库(即惯用方式)?

haskell - 使用自定义数据类型过滤列表

c++ - 链接错误 : Duplicate Symbol

visual-c++ - VC++ 8.0 程序出现链接器错误 : Precombiled Library VC++ 6. 0

c++ - 使用 decltype 返回元素类型的元函数

c++ - 处理进程的终止(c++)

ios - XCode 4.2 Lion(iOS 产品)中与 Objective-C++/C++ 的链接错误

c++ - 检测原始 pcm 数据中的声级

c++ - 如何防止程序退出后控制台输出