我想要做的就是将一个纯文本字符串从Haskell传递给C.但是,它说[Char]是一种不可接受的返回类型.我无法找到他们认为的原因,也无法找到可接受的返回类型.
我正在尝试制作一个非常简单的操作系统映像,我可以用Qemu启动它.
有谁知道如何做到这一点?谢谢.
{-# LANGUAGE ForeignFunctionInterface #-}
module Hello where
import Foreign
import Foreign.C.String
import Foreign.C.Types
hello :: String -> (CString -> IO a) -> IO a
hello = "Hello, world!"
foreign export ccall hello :: String -> (CString -> IO a) -> IO a
Run Code Online (Sandbox Code Playgroud)
kos*_*kus 14
你想要一个CString.
从:CString到String:
peekCString :: CString -> IO String
Run Code Online (Sandbox Code Playgroud)
从:String到CString:
withCString :: String -> (CString -> IO a) -> IO a
Run Code Online (Sandbox Code Playgroud)
还有模块Foreign.C.String的Haddock文档.
可以在foreign声明中使用的一般类型列表被指定为Haskell报告中的外部函数接口的一部分.
好的,这是一个非常小的例子,你可以做一些事情,有些基于你的示例代码.CTest.hs使用以下内容创建Haskell文件:
module CTest where
import Foreign.C
hello :: IO CString
hello = newCString "hello"
foreign export ccall hello :: IO CString
Run Code Online (Sandbox Code Playgroud)
然后创建一个ctest.c包含以下内容的C文件:
#include <stdio.h>
#include "CTest_stub.h"
int main (int argc, char *argv[]) {
hs_init(&argc, &argv);
printf("%s\n", hello());
hs_exit();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
然后编译并运行如下:
$ ghc CTest
[1 of 1] Compiling CTest ( CTest.hs, CTest.o )
$ ghc -o ctest ctest.c CTest.o -no-hs-main
$ ./ctest
hello
Run Code Online (Sandbox Code Playgroud)