我在一个小例子中使用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
foreign export
了你的reverseIO
函数吗?当GHC编译Haskell时,函数不会直接转换为符号,因此如果没有外部导出,链接时将没有reverseIO
符号或编译原型。 - Thomas M. DuBuissonString
不是char *
。也许你需要使用字节串,这似乎是由inline-c支持的。请注意,传递(字节)字符串可能需要处理C级别的分配。 - chi