如何在Haskell的inline-c中从C块返回一个列表或数组?

时间:2016-12-31 10:11:48

标签: haskell inline-c

如何在Haskell的inline-c中从C块获取列表或数组?换句话说,如何在C中构造复杂数据并在Haskell中使用它。 像这样:

foo :: IO [Int]
foo = do
 what? <- [C.block| <what?> {
    ints = calloc(10, sizeof(int));
    // ...
    return <what?>;
  } |]
  return <what?>

我可以在一些Haskell类型中包装指针和大小,但我想在Haskell中使用列表,打印它,用JSON编码等等。

1 个答案:

答案 0 :(得分:3)

从C代码返回指向数组的指针,并使用peekArray将其封送到列表中。

import Foreign.Marshal.Array
import Language.C.Inline

foo :: Int -> IO [Int]
foo size = [exp| int* { calloc($(int size), sizeof(int)) }] >>= peekArray size

peekArray接受一个指针参数和一些要读取的元素。它迭代地递增指针size次,使用类型的Storable实例(在本例中为Int)将元素从数组中拉出。

turn your array into an unboxed Vector可能更有效。