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

Sim*_*lex 7 c++ monads linker haskell static-linking

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

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

aco*_*mar 2

我将保持这个答案相对简短,因为大部分内容都包含在FFI 文档中。

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

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

interact_hs :: FunPtr (CString -> CString) -> IO ()
Run Code Online (Sandbox Code Playgroud)

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

在 C 中,该函数显示为:

extern void interact_hs(char*(*f)(char*));
Run Code Online (Sandbox Code Playgroud)

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

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

与 FFI 合作的其他有用资源:

请随意建议其他有用的链接!