2010-01-26 174 views
20

我正在尋找一種從Java程序內部執行Haskell函數的有效方法。我曾考慮過使用exec()與GHC進行交互,但似乎應該有更好的方法。從Java內部調用Haskell函數的最佳方法

+0

這裏有一個更多的方法:http://stackoverflow.com/questions/10370177/communication-between-java-and-haskell/10370902#10370902 – 2012-05-03 07:17:35

回答

12

我通常會避免JNI型接近整個運行時間/語言鏈接。他們只是有太多的陷阱而且沒有多少好處。我發現跨越流程邊界工作更容易。儘管我從來沒有用Haskell和Java進行過試驗,但他們都有支持XML RPC的庫,這聽起來很適合你正在做的事情。所以:設置一個Haskell程序作爲「服務」,並在需要時調用它的功能。

+2

還有合理的xml-rpx庫,http://hackage.haskell.org/package/haxr – 2010-01-30 05:36:31

2

請參閱Haskell wiki上的Interfacing with other languages: Java

+0

那些專注於從Haskell調用Java代碼。我正在尋找其他方式有效的東西。 – 2010-01-26 17:39:53

+1

其實,Haskell/Java VM橋樑不是你想要的嗎?這是JNI。 – 2010-01-26 17:55:42

8

我假設你知道如何從Java調用C?如果是這樣,那麼你可以按照FFI指南從C調用Haskell,從Java調用C,創建一個橋樑。這是一個本地調用,可能需要一些連接器的擺弄。從C調用哈斯克爾

詳情請看這裏:http://www.haskell.org/haskellwiki/Calling_Haskell_from_C

或者,你可以考慮的RPC服務器。

2

我能想到的最簡單的方法是:在單獨的過程中啓動hint。作爲一個快速演示,愚蠢的事情像

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

可飼餵標準輸入表達式,並給在stdout拉絲效果。當然,這需要更多的工作來確保這是安全的。

(ERR,假設Java有某種popen2十歲上下的功能,否則也許你可以做在插座一樣。)