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

C/C++ wrapper for Haskell IO monad

本文关键字:C++ 包装 IO monad Haskell      更新时间:2023-10-16

我想从C/C++调用一个Haskell函数。我已经阅读了一些与该主题相关的教程,但其中没有涉及IO monad调用。特别是,我想调用一个使用interact函数(interact :: (String -> String) -> IO ())的函数。

  • 我不明白在这种情况下如何使用函数
  • 如何在C/C++包装器中声明函数
  • 标准输入/输出的控制将如何在C/C++和Haskell之间转移(在C/C++代码中)

我将保持这个答案相对简短,因为FFI文档中涵盖了大部分内容。

您可以通过在C中按名称调用函数来使用这些函数。这些函数必须声明为foreign export,并且它与调用Haskell中C模块中定义的函数的foreign import语法相似。在C中,您需要将函数声明为extern,并给它一个普通类型的签名。

您的interact函数不能直接声明,因为它引用了C中没有定义的类型。您可以在Haskell:中定义并编写一个调用interact的相关函数

interact_hs :: FunPtr (CString -> CString) -> IO ()

然后,该函数必须使用其参数(带包装)来调用interact

在C中,此函数显示为:

extern void interact_hs(char*(*f)(char*));

或者类似的东西,我的函数指针语法生疏了。

要从C实际调用此函数,您需要初始化Haskell运行时(在文档中介绍),然后调用该函数,此时执行控制权将传递给Haskell。一旦函数完成并返回,执行的控制权就会传递回C.

与外国金融机构合作的其他有用资源:

  • GHC文件
  • 真实世界Haskell关于外国金融机构的章节
  • Edward Z.Yang关于FFI和c2hs预处理器的系列博客文章

欢迎提出其他有用的链接!