gpt4 book ai didi

haskell - 如何从 Haskell 的 inline-c 中的 C block 返回列表或数组?

转载 作者:行者123 更新时间:2023-12-02 10:12:07 25 4
gpt4 key购买 nike

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

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

我可以用某种 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

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

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

关于haskell - 如何从 Haskell 的 inline-c 中的 C block 返回列表或数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41407363/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com