Вопрос

Я ищу эффективный способ выполнения функций Haskell из программы Java.Я рассматривал возможность использования exec() для взаимодействия с GHC, но, похоже, должен быть метод получше.

Это было полезно?

Решение

Обычно я избегаю подходов типа JNI к связыванию между средами выполнения/языками.У них просто слишком много ошибок и мало преимуществ.Мне легче работать вне границ процесса.Хотя я никогда не пробовал это с Haskell и Java, у них обоих есть библиотеки, поддерживающие XML RPC, и это кажется естественным для того, что вы делаете.Так:настройте программу на Haskell как «сервис» и просто вызывайте ее функции, когда они вам понадобятся.

Другие советы

Я полагаю, вы знаете, как вызвать C из Java?Если да, то вы можете следовать руководству FFI для вызова Haskell из C и C из Java, создавая мост.Это собственный вызов, и может потребоваться некоторая работа с компоновщиками.

Подробности о вызове Haskell из C здесь: http://www.haskell.org/haskellwiki/Calling_Haskell_from_C

В качестве альтернативы вы можете рассмотреть возможность использования RPC-сервера.

Самый простой способ, который я могу придумать:запускать намекать в отдельном процессе.В качестве быстрой демонстрации, что-то глупое вроде

import Control.Monad
import Language.Haskell.Interpreter
main = getContents >>= mapM_ (eval >=> print) . lines

могут передаваться выражения на стандартный ввод и выдавать строковые результаты на стандартный вывод.Конечно, потребуется немного больше работы, чтобы убедиться, что это безопасно.

(Эээ, если предположить, что в Java есть какая-то функциональность типа popen2.В противном случае, возможно, вы можете сделать то же самое с сокетами.)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top