Как передать строку из Haskell в C?

130
14

Все, что я хочу сделать, это передать строку с открытым текстом из 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

спросил(а) 2021-01-19T12:46:23+03:00 2 месяца, 4 недели назад
1
Решение
162

Вы хотите CString.


Переход от CString до String:


peekCString :: CString -> IO String

Переход от String до CString:


withCString :: String -> (CString -> IO a) -> IO a

Там также документация Haddock для модуля Foreign.C.String.


Общий список типов, которые могут использоваться в объявлениях foreign, указан как часть интерфейса внешних функций в отчете Haskell.

Изменить


Хорошо, здесь очень маленький пример того, что вы можете сделать, несколько основанный на вашем примере кода. Создайте файл Haskell CTest.hs со следующим содержимым:


module CTest where

import Foreign.C

hello :: IO CString
hello = newCString "hello"

foreign export ccall hello :: IO CString


Затем создайте файл C ctest.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;
}


Затем выполните компиляцию и выполните следующую команду:


$ ghc CTest
[1 of 1] Compiling CTest ( CTest.hs, CTest.o )
$ ghc -o ctest ctest.c CTest.o -no-hs-main
$ ./ctest
hello

ответил(а) 2021-01-19T12:46:23+03:00 2 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема