2010-01-26 12 views
20

Sto cercando un modo efficiente di eseguire le funzioni Haskell all'interno di un programma Java. Ho considerato l'uso di exec() per interagire con GHC, ma sembra che ci dovrebbe essere un metodo migliore.Il modo migliore per chiamare le funzioni Haskell da Java

+0

Ecco un altro modo: http://stackoverflow.com/questions/10370177/communication-between-java-and-haskell/10370902#10370902 –

risposta

12

Io di solito evitare JNI tipo approcci per il collegamento tra i tempi di esecuzione/lingue. Hanno solo troppi trucchi e un piccolo vantaggio. Trovo più facile lavorare oltre i limiti del processo. Anche se non l'ho mai provato con Haskell e Java, entrambi hanno librerie che supportano XML RPC, e suona come una scelta naturale per quello che stai facendo. Quindi: imposta un programma Haskell come "servizio" e chiama le sue funzioni quando ne hai bisogno.

+2

E ci sono delle librerie xml-rpx ragionevoli, http://hackage.haskell.org/package/haxr –

2

Vedere Interfacing with other languages: Java nella wiki Haskell.

+0

Questi si concentrano sul richiamo del codice Java da Haskell. Stavo cercando qualcosa che funzioni dall'altra parte. –

+1

In realtà, il bridge VM Haskell/Java non è quello che stai cercando? È JNI. –

8

Suppongo tu sappia come chiamare C da Java? In tal caso, è possibile seguire la guida FFI per chiamare Haskell da C e C da Java, creando un bridge. Questa è una chiamata nativa e potrebbe richiedere un po 'di giocherellare con i linker.

Dettagli sulla chiamando Haskell da C sono qui: http://www.haskell.org/haskellwiki/Calling_Haskell_from_C

In alternativa, si potrebbe prendere in considerazione un server RPC.

2

Il modo più semplice che riesco a pensare: avviare hint in un processo separato. A dimostrazione rapida, qualcosa di stupido come

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

può essere alimentato espressioni standard input e darà risultati filamentose su stdout. Certo, ci vorrà un po 'più di lavoro per assicurarsi che questo sia sicuro.

(Err, supponendo che Java ha una sorta di funzionalità popen2-ish. In caso contrario, forse si può fare lo stesso con i socket.)

Problemi correlati