我正在寻找概念上具有签名的 Haskell FFI 函数的完整工作示例:ByteString -> ByteString
,即:
- 将一个 8 位无符号整数数组作为输入,该数组已分配在“c”堆上(即生命周期超过 FFI 调用)。
- 将数组转换为 a
ByteString
(假设ByteString
不能直接在 FFI API 中使用)。 - 以某种方式不变地转换
ByteString
(简单的例子:反转它)。 - 将转换后的(或所需的任何 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 或者它(打算)在结构上同构的事实是否足够?