如何从 Haskell 的inline-c 中的C 块获取列表或数组?换句话说,如何在 C 中构建复杂数据并在 Haskell 中使用它。像这样的东西:
foo :: IO [Int]
foo = do
what? <- [C.block| <what?> {
ints = calloc(10, sizeof(int));
// ...
return <what?>;
} |]
return <what?>
Run Code Online (Sandbox Code Playgroud)
我可以用某种 Haskell 类型包装一个指针和一个大小,但我想在 Haskell 中使用列表,打印它,用 JSON 编码等。
从 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
Run Code Online (Sandbox Code Playgroud)
peekArray接受一个指针参数和许多要读取的元素。它迭代地增加指针时间,使用类型的实例(在本例中为)size从数组中取出元素。StorableInt