如何在 Haskell 的 inline-c 中 return 来自 C 块的列表或数组?

How to return a list or array from C block in Haskell's 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 中编码,等等

Return 从您的 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可能更有效。