2010-01-26 10 views
20

Estoy buscando una forma eficiente de ejecutar las funciones de Haskell desde un programa Java. He considerado el uso de exec() para interactuar con GHC, pero parece que debería haber un método mejor.La mejor manera de llamar a las funciones de Haskell desde Java

+0

Aquí hay una forma más: http://stackoverflow.com/questions/10370177/communication-between-java-and-haskell/10370902#10370902 –

Respuesta

12

normalmente evitar JNI tipo se acerca a la vinculación a través de tiempos de ejecución/idiomas. Simplemente tienen demasiados problemas y poca ventaja. Me resulta más fácil trabajar a través de los límites del proceso. Aunque nunca lo he probado con Haskell y Java, ambos tienen bibliotecas que admiten XML RPC, y suena como un ajuste natural para lo que estás haciendo. Entonces: configure un programa Haskell como un "servicio" y simplemente llame a sus funciones cuando las necesite.

+2

Y hay bibliotecas xml-rpx razonables, http://hackage.haskell.org/package/haxr –

2

Ver Interfacing with other languages: Java en la wiki de Haskell.

+0

Aquellos se centran en invocar el código Java de Haskell. Estaba buscando algo que funcione para el otro lado. –

+1

En realidad, ¿no es el puente Haskell/Java VM lo que estás buscando? Es JNI. –

8

Supongo que sabes cómo llamar a C desde Java? Si es así, puede seguir la guía FFI para llamar a Haskell desde C y C desde Java, creando un puente. Esta es una llamada nativa, y puede requerir un toque de violín.

detalles sobre la llamada Haskell de C están aquí: http://www.haskell.org/haskellwiki/Calling_Haskell_from_C

Alternativamente, usted podría considerar un servidor RPC.

2

La manera más fácil que se me ocurre es iniciar hint en un proceso por separado. Como una demostración rápida, algo tonto como

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

puede ser alimentado expresiones en la entrada estándar y dará resultados fibrosos en la salida estándar. Por supuesto, tomará un poco más de trabajo para asegurarse de que esto sea seguro.

(Err, en el supuesto Java tiene algún tipo de funcionalidad popen2-ish. De lo contrario, tal vez usted puede hacer lo mismo a través de sockets.)

Cuestiones relacionadas