Лучший способ вызвать функции Haskell из Java - PullRequest
21 голосов
/ 26 января 2010

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

Ответы [ 4 ]

13 голосов
/ 27 января 2010

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

11 голосов
/ 26 января 2010

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

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

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

2 голосов
/ 27 января 2010

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

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

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

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

2 голосов
/ 26 января 2010
...