Python FFI中的Haskell函数

2 投票
2 回答
1156 浏览
提问于 2025-04-17 17:29

我想在我的Python程序中使用Haskell函数,方法是通过FFI(外部函数接口)。

我的函数看起来像这样:f :: String -> String

有没有人能帮我一下?

我还有另一个函数:f2 :: [(Double,Double,Double)] -> ((Double,Double,Double),(Double,Double,Double))

编辑:

我在这里找到了一些信息:https://github.com/nh2/call-haskell-from-anything

我知道怎么在Python中调用像fib :: Int -> Int这样的函数。

比如:

module Example where

import Foreign.C.Types

fibonacci :: Int -> Int
fibonacci n = fibs !! n
    where fibs = 0 : 1 : zipWith (+) fibs (tail fibs)

fibonacci_hs :: CInt -> CInt
fibonacci_hs = fromIntegral . fibonacci . fromIntegral

foreign export ccall fibonacci_hs :: CInt -> CInt

但是我不知道怎么让函数funciton :: String -> String在Python中可调用。

2 个回答

1

这里有一些方法可以让你在 Python 中调用 Haskell

有一个开源项目叫做 HaPy,它提供了一个简单易用的接口,可以方便地进行调用。这个项目支持 Haskell 中的字符和字符串类型。

还有一种方法是使用 ctypes.cdll.LoadLibrary,这里有一个示例 在这里。你需要结合 sclv 的回答和 CString 一起使用。

想了解如何使用 CString,可以参考这个回答中的示例。

1

就像你需要把你的 fib 函数从 Int 类型包装成 CInt 类型一样,你也需要把你的字符串函数从 String 类型包装成 CString 类型。你可以在这里找到更多信息:http://www.haskell.org/ghc/docs/latest/html/libraries/base/Foreign-C-String.html

撰写回答