Я ищу эффективный способ выполнения функций Haskell из Java-программы. Я рассмотрел использование exec() для взаимодействия с GHC, но похоже, что должен быть лучший метод.
Лучший способ вызова функций Haskell из Java
Ответ 1
Я обычно избегаю подходов типа JNI к связыванию во время выполнения/языки. У них просто слишком много ошибок и небольшой рост. Мне легче работать через границы процесса. Хотя я никогда не пробовал его с Haskell и Java, у них есть библиотеки, поддерживающие XML RPC, и это звучит как естественное соответствие тому, что вы делаете. Итак: настройте программу Haskell как "службу" и просто вызовите ее функции, когда они вам понадобятся.
Ответ 2
Я предполагаю, что вы знаете, как вызвать C из Java? Если да, то вы можете следовать руководству FFI для вызова Haskell с C и C с Java, создавая мост. Это нативный вызов, и может потребоваться некоторая работа с компоновщиками.
Подробности о вызове Haskell из C: http://www.haskell.org/haskellwiki/Calling_Haskell_from_C
Кроме того, вы можете рассмотреть RPC-сервер.
Ответ 3
См. Взаимодействие с другими языками: Java в вики Haskell.
Ответ 4
Самый простой способ, о котором я могу думать: запустить hint в отдельном процессе. Как быстрая демонстрация, что-то немое как
import Control.Monad
import Language.Haskell.Interpreter
main = getContents >>= mapM_ (eval >=> print) . lines
можно передавать выражения на stdin и давать строгие результаты на stdout. Конечно, это займет немного больше работы, чтобы убедиться, что это безопасно.
(Err, предполагая, что у Java есть своего рода функция popen2-ish. В противном случае, возможно, вы можете сделать то же самое над сокетами.)