Haskell IO monad的C/C++包装器
C/C++ wrapper for Haskell IO monad
我想从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预处理器的系列博客文章
欢迎提出其他有用的链接!
相关文章:
- 如何在c++17中制作一个模板包装器/装饰器
- std::vector的包装器,使数组的结构看起来像结构的数组
- 如何在c++迭代器类型中包装std::chrono
- 是否可以用"iostream"包装现有的TCP/OOpenSSL会话
- 用pybind11包装C++抽象类时出错
- 为左值和右值的包装器实现C++范围
- C结构,其指针将被包装在unique_ptr中
- 如何包装第三方DLL在R中使用
- 在类型和包装器之间reinterpret_cast是否安全<Type>?
- 将 N-arg 函数包装到另一个函数中
- 元组由 Swig 生成的 Python 包装器返回,用于C++向量
- 包装一个对象并假装它是一个 int
- 使用 Python Extension API 包装复杂C++类
- 外壳包装器句柄/执行交互式命令管道C++ UNIX
- 包装C++类时不完整的类型 GLFWwindow
- 将函数包装器转换为 std::function
- C++函数包装器来捕获某些信号
- 创建包装升压适配器的自定义范围类
- 如何包装(撰写)增强 hana 地图并访问括号运算符(运算符 [])?
- 使用运算符*重载包装矩阵乘法