2010-01-26 17 views
20

Je cherche un moyen efficace d'exécuter des fonctions Haskell à partir d'un programme Java. J'ai examiné l'utilisation de exec() pour interagir avec GHC, mais il semble qu'il devrait y avoir une meilleure méthode.Meilleure façon d'appeler des fonctions Haskell depuis Java

+0

Voici une autre façon: http://stackoverflow.com/questions/10370177/communication-between-java-and-haskell/10370902#10370902 –

Répondre

12

J'évite généralement de type JNI approche de relier entre runtimes/langues. Ils ont juste trop de pièges et peu d'avantages. Je trouve qu'il est plus facile de travailler à travers les limites du processus. Bien que je ne l'ai jamais essayé avec Haskell et Java, ils ont tous les deux des bibliothèques qui prennent en charge XML RPC, et cela semble naturel pour ce que vous faites. Donc: configurez un programme Haskell comme un "service" et appelez simplement ses fonctions quand vous en avez besoin.

+2

Et il existe des bibliothèques xml-rpx raisonnables, http://hackage.haskell.org/package/haxr –

2

Voir Interfacing with other languages: Java sur le wiki Haskell.

+0

Celles-ci se concentrent sur l'invocation de code Java à partir de Haskell. Je cherchais quelque chose qui fonctionne dans l'autre sens. –

+1

En réalité, le pont Haskell/Java VM n'est-il pas ce que vous cherchez? C'est JNI. –

8

Je suppose que vous savez comment appeler C à partir de Java? Si c'est le cas, vous pouvez suivre le guide FFI pour appeler Haskell depuis C, et C depuis Java, en créant un pont. Ceci est un appel natif, et peut nécessiter quelques manipulations avec les linkers.

Détails sur l'appel Haskell de C sont ici: http://www.haskell.org/haskellwiki/Calling_Haskell_from_C

Alternativement, vous pouvez envisager un serveur RPC.

2

La façon la plus simple que je peux penser: démarrer hint dans un processus séparé. Comme une démonstration rapide, quelque chose de stupide comme

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

peut nourrir des expressions sur stdin et donnera des résultats filandreux sur stdout. Bien sûr, il faudra un peu plus de travail pour s'assurer que c'est sûr.

(Err, en supposant Java a une sorte de fonctionnalité popen2-ish. Sinon, peut-être vous pouvez faire la même chose sur des sockets.)