Haskell IO单子的C/C++封装器

7
我想从C/C++调用一个Haskell函数。我已经阅读了一些相关的教程,但它们并没有涵盖IO单子调用。特别地,我想调用一个使用interact函数的函数 (interact :: (String -> String) -> IO ())。
  • 我不明白如何在这种情况下使用函数?
  • 我应该如何在C/C++包装器中声明函数?
  • 控制标准输入/输出将如何在C/C++和Haskell之间传递 (在C/C++代码中)?

你想从C中调用Haskell,还是从Haskell中调用C? - cassandracomar
@acomar 我相信 OP 想要从 C 中调用 Haskell。 - duplode
@duplode 没错,我想从C/C++中调用Haskell。 - Simplex
1个回答

2

我会尽量简短地回答,因为大部分内容在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。

使用FFI的其他有用资源:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接