Я широко использую это, компилируя совместно используемые библиотеки на Haskell, которые вызываются за пределами Haskell.
Обычно для этого нужно:
- создавать правильные декларации внешнего экспорта
- создать хранимые экземпляры для любых типов данных, которые необходимо маршалировать
- создать структуры C (или структуры на языке, который вы используете), чтобы прочитать эту информацию
- , поскольку я нехочу вручную инициализировать RTS haskell, я добавляю код инициализации / завершения в саму библиотеку.(dllmain в windows __attribute__ ((конструктор)) в unix)
- , поскольку мне больше не нужен ни один из них, я создаю файл .def, чтобы скрыть все функции closure и rts от нахождения в таблице экспорта (windows)
- использовать GHC для компиляции всего вместе
Эти задачи довольно автоматизированы и структурированы, так что вы могли бы написать что-нибудь для их автоматизации.Фактически, я использую это для себя - это инструмент, который я создал, который выполняет трассировку зависимостей от функций, которые вы пометили для экспорта, и он обернет их и скомпилирует для вас разделяемую библиотеку вместе с предоставлением вам объявлений на C / C ++.
(к сожалению, этот инструмент еще не взломан, потому что есть кое-что, что мне еще нужно исправить и протестировать, прежде чем я смогу это сделать)
Инструмент доступен здесь http://hackage.haskell.org/package/Hs2lib-0.4.8