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