Haskell inline-c-cpp调用Haskell函数

标签 haskell

我在一个小例子中使用 inline-c-cpp 来反转字符串:

[C.block| void {
        static char strTest[128] = "Hello, Haskell!";
        c_func();
  } |]

Haskell 代码是:

reverseIO :: BS.ByteString -> IO BS.ByteString
reverseIO str = return $ BS.reverse str

c_func() 是在我通过 C.include "test.c" 包含的另一个 c 文件中定义的 在那个 test.c 我调用

$fun:(char * (*reverseIO)(char * ))(strTest)

我遇到了几个错误:

 error: use of undeclared identifier 'reverseIO'
              $fun:(char (*reverseIO)(char * ))(strTest)
                           ^

谁能帮我解决这个问题?

更新: 我终于用正确的 C 函数指针语法让它工作了。

  [C.block| void {
           c_func($fun:(char* (*reverseIO)(char*)));
                         } |]

但我仍然有类型问题:

• Couldn't match type ‘BS.ByteString’ with ‘GHC.Ptr.Ptr CChar’
  Expected type: GHC.Ptr.Ptr CChar -> IO (GHC.Ptr.Ptr CChar)
    Actual type: BS.ByteString -> IO BS.ByteString

最佳答案

终于成功了:

import           Data.Monoid           ((<>))
import           Foreign.C.String
import qualified Language.C.Inline.Cpp as C

C.context (C.cppCtx <> C.baseCtx  <>C.funCtx)

C.include "pageturnerui.cpp"

someFunc :: IO ()
someFunc = do
  let reverseIO :: CString -> IO CString
      reverseIO cs = peekCString cs >>= return. reverse >>= newCString

  [C.block| void {
      pageturnerui($fun:(char* (*reverseIO)(char *)));
                         } |]

在我的 pageturnerui.cpp 中:

int pageturnerui(char* (*foo)(char*))
{
...
            static char strTest[128] = "Hello, Haskell!";

            if (ImGui::Button("Button")) {
              strcpy(strTest, foo(strTest));
            }
...
}

PS:我的代码没有说明最佳实践。我没有足够的经验能够就此提供建议。只是表明它可以编译和工作并且没有崩溃。

关于Haskell inline-c-cpp调用Haskell函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53870097/

相关文章:

haskell - 列表推导式中的 where 子句

haskell - 如何为这个特定结构实现 foldr?

haskell - 从运算符推断类型类别

Haskell Monad 状态示例

haskell - 如何在 GHCi 中从 "target list"删除模块

haskell - "module [...] is defined in multiple files"Haskell 编译错误

haskell - GHCi 中的类型推断与手动签名

haskell - 简单列表创建中的评估顺序是什么?

Haskell:多个字符串之间的所有组合

haskell - Control.Monad foldM 意外的内存增长