Лучший способ вызвать функции Haskell из Java

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

21
задан Don Stewart 18 April 2011 в 22:02
поделиться

4 ответа

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

13
ответ дан 29 November 2019 в 21:32
поделиться

Если вы используете 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-сервер.

11
ответ дан 29 November 2019 в 21:32
поделиться

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

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

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

(ERR, предполагая, что Java имеет какой-то функциональность POPEN2-ISH. В противном случае, возможно, вы можете сделать то же самое по сокетам.)

2
ответ дан 29 November 2019 в 21:32
поделиться
2
ответ дан 29 November 2019 в 21:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: