从Python调用Haskell函数
我想在Python中使用一些Haskell的库,比如Darcs和Pandoc,但好像Python没有直接和Haskell连接的接口。有没有什么办法可以做到这一点呢?
6 个回答
还有一个额外的想法:有一种比直接用C语言绑定效率低,但比调用Haskell更高效的方式,那就是使用像Apache Thrift这样的远程过程调用(rpc)系统:http://incubator.apache.org/thrift/
我发现Thrift使用起来很简单,支持也很好,性能也不错。一旦你的Haskell服务器启动了,本地通信的成本相对较低,虽然在数据转换上花费会比直接使用C语言的类型多一点。
另外,还有至少两个可以从Haskell调用Python的包,分别是missingpy(http://hackage.haskell.org/package/MissingPy)和cpython(http://hackage.haskell.org/package/cpython)。后者声称计划支持反向调用——不过你得问一下作者,这个计划是否还在进行,如果是的话,什么时候会实现。
另一个选择是 hyphen,你可以在 这里找到它。基本用法看起来像这样:
>>> import hyphen, hs.Prelude
>>> hs.Prelude.sum([1,2,3]) # list converted to Haskell list
6
>>> hs.Prelude.drop(5, "Hello, world")
", world"
>>> hs.Prelude.drop(1, [1,2,3])
<hs.GHC.Types.[] object of Haskell type [GHC.Integer.Integer], containing '[2,3]'>
>>> list(hs.Prelude.drop(1, [1,2,3])) # Convert back to Python list
[2, 3]
这个方案似乎比其他一些答案中的选项要重一些。
不过,作为回报,你可以实现从 Haskell 到 Python 的完整桥接。相比之下,HaPy
和 github.com/nh2/call-haskell-from-anything
只允许你在 Python 中使用 Haskell 函数,前提是这个 Haskell 函数的所有参数都是比较简单的类型,并且返回的类型也比较简单,而 hyphen
似乎可以让你使用 任意 函数。它之所以能做到这一点,是因为它在 Python 中引入了一种表示 Haskell 堆上任意对象的类型。
这些“从 Python 看到的 Haskell 对象”在 Python 中表现得相当不错。例如,Haskell 的 Map
类似于字典:
>>> import hs.Data.Map
>>> my_map = hs.Data.Map.fromList([(1, 'Hello'), (2, 'World')])
>>> my_map[1]
'Hello'
>>> print(sorted([key for key in my_map]))
[1, 2]
想要更多示例,可以查看自述文件!
它似乎还可以处理一些复杂的事情,比如在 Haskell 和 Python 之间转换异常。