Sim*_*lex 7 c++ monads linker haskell static-linking
我想从C/C++调用Haskell函数.我已经阅读了一些与该主题相关的教程,但其中没有涉及IO monad调用.特别是,我想调用一个使用interactfunction(interact :: (String -> String) -> IO ())的函数.
我将保持这个答案相对简短,因为大部分内容都包含在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 合作的其他有用资源:
请随意建议其他有用的链接!