gpt4 book ai didi

arrays - OCaml 中未初始化的数组

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

如何在 OCaml 中定义未初始化的数组?

我尝试这样做:

let arr = Array.make_matrix 2 2

Error: The type of this expression, '_a -> '_a array array,
contains type variables that cannot be generalized

当然我可以用 0 填充矩阵。但是我有一个类型问题,因为我想在这个数组中存储两个不同用户的输入和输出 channel (ic 和 oc):

let fd, _ = conn in
let ic = Lwt_io.of_fd Lwt_io.Input fd in
let oc = Lwt_io.of_fd Lwt_io.Output fd in

请告诉我,我该如何填充这样的数组?

尝试使用答案。

let ic1 = ref None
...
ic1 := ic;

Error: This expression has type Lwt_io.input Lwt_io.channel
but an expression was expected of type 'a option

let arr = Array.make_matrix 2 2 None
...
arr.(0).(0) <- ic;

Error: This expression has type Lwt_io.input Lwt_io.channel
but an expression was expected of type 'a option

最佳答案

在 OCaml 中,您无法构建元素未初始化的数组。您必须使用稍后要填充的相同类型的默认值来初始化它们。

我不熟悉Lwt_io,并且不确定是否有可以用作默认值的 channel 值。一般来说,如果很难为某些类型 t 构建这样的默认值,则可以使用 t option 而不是 t 作为数组类型元素并填充 None,运行时检查 SomeNone 的成本。

如果您可以使用虚拟 channel 值,

let arr = Array.make_matrix 2 2 dummy_channel
arr.[0].[0] <- ch

但我不知道你可以使用这样的虚拟值Lwt_io。否则,

let arr = Array.make_matrix 2 2 None
arr.[0].[0] <- Some ch

顺便说一句,输入 channel 和输出 channel 具有不同的类型,因此您不能将它们插入一个数组中。也许您应该在这里使用'mode channel ref的多个引用,而不是一个数组。

let ichan = ref None
ichan := Some ich
let ochan = ref None
ochan := Some och

不太清楚为什么提问者想要这里的可变性。也许正确的答案是根本不使用它们。

关于arrays - OCaml 中未初始化的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33494879/

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