Ocaml Cstruct和Lwt_字节

Ocaml Cstruct和Lwt_字节,ocaml,ocaml-lwt,Ocaml,Ocaml Lwt,据我所知,Lwt_字节似乎使用与Cstruct相同的类型(或者可能使用Cstruct本身),但出于某种原因,我无法使这两个字节一起工作: Lwt_io.write_from_exactly out b.Cstruct.buffer 0 16 Error: This expression has type Cstruct.buffer = (char, Bigarray.int8_unsigned_elt, Bigarray.c_layout)

据我所知,Lwt_字节似乎使用与Cstruct相同的类型(或者可能使用Cstruct本身),但出于某种原因,我无法使这两个字节一起工作:

Lwt_io.write_from_exactly out b.Cstruct.buffer 0 16


Error: This expression has type
         Cstruct.buffer =
           (char, Bigarray.int8_unsigned_elt, Bigarray.c_layout)
           Bigarray.Array1.t
       but an expression was expected of type bytes
字节不是完全相同的类型吗?我怎样才能做到这一点?为了方便Cstruct.LE,我尝试使用Cstruct而不是Lwt_字节,而Cstruct.LE似乎没有字节。
感谢

据我所知,的第二个参数的类型为
bytes
(一个可变的OCaml字符串),而a是一个由8位整数组成的大数组。 虽然底层的“有效负载”是相同的(无符号字符的字对齐数组;请参见宏),但OCaml级别的“值包装器”是不同的(例如,请参见)

您是否尝试使用从一个转换到另一个


不幸的是,这是错误的,因此最好重新思考您的总体方法。你的问题中没有足够的信息来提出更精确的建议。

这个答案是正确的。更详细地说,
Lwt_bytes.t
s是与Cstruct兼容的大数组,但是
bytes
是核心OCaml类型,即可变字符串的类型。命名很混乱,因此很容易认为
字节
=
Lwt\u字节.t
。原因是
Lwt_bytes
早在
bytes
作为一种新类型添加到核心语言之前就被命名了
Lwt_io
构建在
字节上,即常规(可变)OCaml字符串。要对
Lwt\u bytes.t
进行I/O,必须使用模块
Lwt\u bytes
(或其他bigarray库)中的函数。我还想指出,使用
string
s或
bytes
(如
Lwt\u io
)的异步I/O几乎总是比使用BigString的I/O效率更低(与Cstruct类似,
Lwt_bytes
)。这是因为
string
bytes
存储由垃圾收集器管理,并且可以移动,因此Lwt(或任何其他I/O库)必须进行内部复制,因此数据的地址在I/O期间保持不变。Bigstrings(
Lwt_bytes.t
,Cstruct)固有地分配有固定存储,因此I/O不需要复制。
Lwt\u字节
API(当前)不需要复制然而,正如
Lwt_io
一样丰富。我明白,我确实没有意识到Lwt_字节。t和bytes不一样。现在这更有意义了,使用bytes确实很好。因为我使用Lwt_io,我只是用bytes替换了cstruct