Обертка C / C ++ для монады Haskell IO

Я хочу вызвать функцию Haskell из C / C ++. Я уже прочитал несколько уроков, связанных с этой темой, но вызовы монада IO в них не рассматриваются. В частности, я хотел бы вызвать функцию, которая использует interact функция (interact :: (String -> String) -> IO ()).

  • Я не понимаю, как использовать функции в этом случае?
  • Как я могу объявить функцию в оболочке C / C ++?
  • Как управление стандартным вводом / выводом будет передаваться между C / C ++ и Haskell (в коде C / C ++)?

7

Решение

Я собираюсь держать этот ответ относительно кратким, потому что большая часть этого покрыта в Документация FFI.

Вы можете использовать функции, вызывая их по имени в C. Функции должны быть объявлены как foreign export и это параллельно foreign import синтаксис для вызова функций, определенных в модуле C в Haskell. В C вам нужно объявить функцию как extern и дать ему нормальную подпись типа.

Ваш interact Функция не может быть объявлена ​​напрямую, потому что она ссылается на типы, которые не определены в C. Вы можете определить и написать связанную функцию, которая вызывает interact в Хаскеле:

interact_hs :: FunPtr (CString -> CString) -> IO ()

Затем эта функция должна использовать свой аргумент (с переносом) для вызова interact,

В C эта функция выглядит как:

extern void interact_hs(char*(*f)(char*));

Или что-то вроде этого, мой синтаксис указателя функции ржавый.

Чтобы фактически вызвать эту функцию из C, вам нужно инициализировать среду выполнения Haskell (описанную в документации), а затем вызвать функцию, после чего управление выполнением переходит в Haskell. После завершения и возврата функции управление выполнением возвращается обратно в C.

Другие полезные ресурсы для работы с FFI:

Не стесняйтесь предлагать другие полезные ссылки!

2

Другие решения


По вопросам рекламы [email protected]