我想从C/C++调用
Haskell函数.我已经阅读了一些与该主题相关的教程,但其中没有涉及IO monad调用.特别是,我想调用一个使用交互功能的函数(interact ::(String – > String) – > IO()).
>我不明白在这种情况下如何使用函数?
>如何在C/C++包装器中声明函数?
>如何在C/C++和Haskell之间(在C/C++代码中)传输标准输入/输出的控制?
解决方法
我将保持这个答案相对简短,因为大部分内容都在
FFI documentation中介绍.
您可以通过在C中按名称调用它们来使用这些函数.函数必须声明为外部导出,并且它与调用Haskell中C模块中定义的函数的外部导入语法相似.在C中,您需要将该函数声明为extern并为其指定正常的类型签名.
您的交互函数不能直接声明,因为它引用了未在C中定义的类型.您可以定义和编写在Haskell中调用交互的相关函数:
interact_hs :: FunPtr (CString -> CString) -> IO ()
extern void interact_hs(char*(*f)(char*));
或类似的东西,我的函数指针语法生锈.
要从C实际调用此函数,您需要初始化Haskell运行时(在文档中介绍),然后调用该函数,此时控制执行进入Haskell.一旦函数完成并返回,执行控制权将传回C.
与FFI合作的其他有用资源:
> GHC documentation
>真实世界Haskell在FFI上的chapter
> Edward Z. Yang在FFI上的blog post series和c2hs预处理器
随意建议其他有用的链接!