Вызов библиотеки Haskell из С++

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

Когда функции в библиотеке haskell используют простые типы, такие как int или float, это не проблема, но что, когда они используют структуры в качестве аргументов? Что является наиболее масштабируемым решением в этом случае?

Ответы

Ответ 1

Вам нужно написать код haskell, чтобы вывести эти структуры данных в те, которые вы можете использовать в Haskell. Инструмент c2hs очень полезен в этом отношении: http://hackage.haskell.org/package/c2hs

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

Также обратите внимание, что с помощью сгенерированных стилей c2hs вам не нужно сортировать все. Вы можете просто создать аксессуры, чтобы заглянуть в части структур данных C, которые вам действительно нравятся.

Ответ 2

Поздно к вечеринке, но я думаю, вы хотите использовать это:

В частности что-то вроде foreign export ccall foo :: Int -> IO Int. Что будет генерировать заголовок, например:

#include "HsFFI.h"
extern HsInt foo(HsInt a0);

Подробнее см. ссылку (например, как интегрироваться в вашу С++-программу).