我有一个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
的函数一起使用,但我无法弄清楚如何放置它与三个一起。
答案 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
的实现就不那么明了了)