将几个ByteStrings传递给C

时间:2014-05-09 15:04:57

标签: c haskell bytestring

我有一个C函数,我希望通过带有三个字符串的FFI向Haskell公开:

c_fun :: CString -> CString -> CString -> IO ()

如何使用useAsCString中的Data.ByteString从Haskell传递3 ByteString?即我正在寻找以下的实施方案:

haskellFun :: ByteString -> ByteString -> ByteString -> IO ()

useAsCString的类型为ByteString -> (CString -> IO a) -> IO a,因此很清楚如何将其与接受一个CString的函数一起使用,但我无法弄清楚如何放置它与三个一起。

1 个答案:

答案 0 :(得分:2)

这会有用吗?

useAsCStrings3
    :: (CString -> CString -> CString -> IO a)
    -> ByteString -> ByteString -> ByteString
    -> IO a
useAsCStrings3 f a b c =
    useAsCString a (\a' ->
        useAsCString b (\b' ->
            useAsCString c (\c' ->
                f a' b' c'
            )
        )
    )

它为我打字检查,过去使用C库时我使用了类似的技术。您可以将haskellFun实现为

haskellFun = useAsCStrings3 c_fun

(注意:在此编辑过程中我交换了参数的顺序以使用AsCStrings3,否则haskellFun的实现就不那么明了了)