Haskell FFI将多个数组传递给C

时间:2017-06-13 03:52:48

标签: c haskell ffi

我有一个类型为

的C函数
int func(int len1, int *array1, int len2, int *array2);

我想从Haskell打来电话。它不会修改其内容。我想从列表中传递数据。我一直在寻找Foreign.Marshal.Array,但我很困惑。 newArray或withArray似乎都按我的意愿行事,但是例如withArray采用类型为

的函数
Ptr a -> IO b

鉴于我的函数中有两个数组,我不太确定如何处理。到目前为止,我有:

foreign import ccall unsafe "func.h func"
    c_func :: CInt -> Ptr CInt -> CInt -> Ptr CInt -> IO CInt

我不知道怎么称呼它。在文档(https://wiki.haskell.org/Foreign_Function_Interface#Arrays)中,它只是说阅读Foreign.Marshall.Array。

谢谢!

编辑:拼写错误。

1 个答案:

答案 0 :(得分:1)

withArray*函数在函数范围内为您提供Ptr。您可以将其编写为lambda内联,如下所示:

func :: [CInt] -> [CInt] -> IO CInt
func list1 list2 =
    withArrayLen list1 $ \len1 array1 ->
      withArrayLen list2 $ \len2 array2 ->
        c_func (fromIntegral len1) array1 (fromIntegral len2) array2

您也可以单独计算长度,例如

func list1 list2 =
    withArray list1 $ \array1 ->
      withArray list2 $ \array2 ->
        c_func len1 array1 len2 array2
  where
    len1 = genericLength list1
    len2 = genericLength list2