0

我正在寻找概念上具有签名的 Haskell FFI 函数的完整工作示例:ByteString -> ByteString,即:

  1. 将一个 8 位无符号整数数组作为输入,该数组已分配在“c”堆上(即生命周期超过 FFI 调用)。
  2. 将数组转换为 a ByteString(假设ByteString不能直接在 FFI API 中使用)。
  3. 以某种方式不变地转换ByteString(简单的例子:反转它)。
  4. 将转换后的(或所需的任何 FFI 表示)返回到调用“c”函数ByteString,以便必须在“c”端删除它。

谷歌搜索显示了各种相关和/或部分信息,但这里的细节非常重要:我无法在任何地方找到相关的 MWE(人们认为是基本的 FFI 应用程序)。

编辑:一位评论者亲切地指出 ByteString 已经封装了一个指针和一个长度。

这导致了一些更具体的问题:

Q1。对应的“c”函数签名 ByteString -> ByteString应该是什么?

例如,是否有必要在“c”端显式定义 ByteString?

struct ByteString { uint8 * array; size_t length }; 
ByteString cfunc(ByteString arg); 

看起来直接翻译它不会产生有效的 FFI 调用。为了:

foreign export ccall cfunc ::  ByteString -> ByteString

编译器错误是“无法在外部调用中编组字节字符串”。

Q2 arg 是否必须在 Haskell 端以某种方式转换为 ByteString 或者它(打算)在结构上同构的事实是否足够?

4

0 回答 0