如何在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
Run Code Online (Sandbox Code Playgroud)
当然我可以用0填充矩阵.但是后来我遇到了类型问题,因为我想在两个不同用户的数组输入和输出通道(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
Run Code Online (Sandbox Code Playgroud)
请告诉我,如何填写这样的阵列?
尝试使用答案.
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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
在OCaml中,您无法构建其元素未初始化的数组.您必须使用稍后要填充的相同类型的默认值对它们进行初始化.
我不熟悉Lwt_io并且不确定您可以使用默认的通道值.通常,如果很难为某些类型构建这样的默认值t,则可以使用t option而不是t数组元素的类型并填充None,运行时检查Some和的成本None.
如果你可以使用虚拟通道值,那么,
let arr = Array.make_matrix 2 2 dummy_channel
arr.[0].[0] <- ch
Run Code Online (Sandbox Code Playgroud)
但我不知道你可以使用这样的虚拟值Lwt_io.除此以外,
let arr = Array.make_matrix 2 2 None
arr.[0].[0] <- Some ch
Run Code Online (Sandbox Code Playgroud)
顺便说一句,输入通道和输出通道有不同的类型,因此你不能将它们推入一个阵列.你应该在这里使用的是几个引用'mode channel ref,而不是一个数组.
let ichan = ref None
ichan := Some ich
let ochan = ref None
ochan := Some och
Run Code Online (Sandbox Code Playgroud)
目前还不清楚提问者为什么要在这里做出可变性.可能正确的答案是根本不使用它们.