Я смотрю эффективный способ выполнить функции Haskell из программы Java. Я полагал, что использование должностного лица () взаимодействует с GHC, но кажется, что должен быть лучший метод.
Обычно я избегаю подходов типа JNI при соединении через время выполнения/языки. Просто у них слишком много готч и мало преимуществ. Я считаю, что легче работать через границы процесса. Хотя я никогда не пробовал этого с Haskell и Java, у них обоих есть библиотеки, поддерживающие XML RPC, и это звучит как естественное приспособление к тому, что вы делаете. Итак: настройте программу Haskell как "сервис" и просто вызывайте ее функции, когда они вам понадобятся.
Если вы используете Java 5 или выше, используйте AtomicBoolean
-121--1235553- В целом, вы хороши, поскольку House
создает переменную-член m _ room
сама по себе Это соответствует образцу, который используется предметом сразу после создания экземпляра (он не требует специальных действий, таких как установка комнаты или чего-либо еще).
У меня есть некоторые незначительные nit-подборки:
class Room
{
public:
// virtual method to allow overriding
virtual void ColorRoom(){};
};
class House
{
public:
// Returning a non-const pointer in C++ is typically a bad smell.
const Room& Room() const { return m_room; }
// Allow for assignment and manipulating room, but breaks const-ness
Room& Room() { return m_room; }
// Facade method for houses with more than one room
// You can forward parameters or come up with room-painting schemes, but you should
// not require that a House has a Room called Room().
virtual void ColorAllRooms()
{
m_room.ColorRoom();
}
private:
Room m_room;
};
-121--4167091- Я предполагаю, что вы знаете, как вызвать 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
, можно кормить выражениями на stdin и даст строгие результаты на STDOUT. Конечно, это будет немного больше работы, чтобы убедиться, что это безопасно.
(ERR, предполагая, что Java имеет какой-то функциональность POPEN2-ISH. В противном случае, возможно, вы можете сделать то же самое по сокетам.)
Смотрите Взаимодействие с другими языками: Java в вики Haskell.