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

5 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?>
Run Code Online (Sandbox Code Playgroud)

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

Ben*_*son 4

从 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

数组变成未装箱的Vector.

  • 上面的代码不会泄漏分配的指针吗?在查看之后我们需要调用“free”,对吗? (3认同)