Question

I'm looking an efficient way of executing Haskell functions from within a Java program. I've considered the use of exec() to interact with GHC, but it seems like there should be a better method.

Was it helpful?

Solution

I usually avoid JNI-type approaches to linking across runtimes/languages. They just have too many gotchas and little upside. I find it easier to work across process boundaries. While I've never tried it with Haskell and Java, they both have libraries that support XML RPC, and it sounds like a natural fit for what you're doing. So: set up a Haskell program as a "service" and just call its functions when you need them.

OTHER TIPS

I assume you know how to call C from Java? If so, then you can follow the FFI guide to call Haskell from C, and C from Java, creating a bridge. This is a native call, and may require some fiddling with linkers.

Details on calling Haskell from C are here: http://www.haskell.org/haskellwiki/Calling_Haskell_from_C

Alternatively, you might consider an RPC server.

See Interfacing with other languages: Java on the Haskell wiki.

Easiest way I can think of: start up hint in a separate process. As a quick demonstration, something dumb like

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

can be fed expressions on stdin and will give stringy results on stdout. Of course, it'll take a little more work to make sure this is safe.

(Err, assuming Java has some sort of popen2-ish functionality. Otherwise maybe you can do the same over sockets.)

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top