私はJavaプログラム内からHaskell関数を実行する効率的な方法を探しています。exec()を使用してGHCと対話することを検討しましたが、より良いメソッドがあるはずです。
3 に答える
私は通常、ランタイム/言語間でリンクするための JNI タイプのアプローチを避けます。彼らには落とし穴が多すぎて、利点がほとんどありません。プロセスの境界を越えて作業する方が簡単だと思います。私は Haskell と Java で試したことはありませんが、どちらにも XML RPC をサポートするライブラリがあり、あなたが行っていることに自然に適合しているように思えます。つまり、Haskell プログラムを「サービス」としてセットアップし、必要なときにその関数を呼び出すだけです。
JavaからCを呼び出す方法を知っていると思いますか? その場合は、FFI ガイドに従って、C から Haskell を呼び出し、Java から C を呼び出して、ブリッジを作成できます。これはネイティブ呼び出しであり、リンカーをいじる必要がある場合があります。
C から Haskell を呼び出す方法の詳細はこちら: 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 っぽい機能があると仮定します。それ以外の場合は、ソケットを介して同じことを行うことができます。)