如何将字符串从Haskell传递给C?

Sea*_*iss 8 c haskell ffi

我想要做的就是将一个纯文本字符串从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.

从:CStringString:

peekCString :: CString -> IO String
Run Code Online (Sandbox Code Playgroud)

从:StringCString:

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)

  • 您的代码有几个问题.`hello`是一个字符串文字,但你给它一个函数类型.并且`String`仍然出现在导出实体的类型中.您可能希望首先阅读Haskell外部函数接口的一些介绍. (2认同)