2015-11-03 87 views
2

如何在OCaml中定义未初始化的数组?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矩阵但后来我有一个类型的问题,因为我想在这个阵列输入和输出通道存储(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 
+0

如果它是一个通道数组,那么当您访问某个元素时,您必须获得一个通道。访问此类未初始化数组的元素时,您将获得什么渠道? – newacct

+0

我已经写了一个正确的方式来使用选项类型。你的代码是不一样的。 – camlspotter

回答

5

在OCaml中,你不能建立与它的元素初始化数组。您必须使用稍后将要填写的相同类型的某个默认值来初始化它们。

我对Lwt_io不熟悉,不确定是否有可用作默认值的通道值。一般情况下,如果难以建立某种类型的默认值t,则可以使用t option而不是t作为阵列元素的类型,并填写None,运行时检查的代价为SomeNone

如果可以使用,然后虚拟通道值,

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 

顺便说一句,输入通道和输出通道具有不同的类型,因此无法推送它们变成一个阵列。可能你应该在这里使用几个'mode channel ref的引用,而不是一个数组。

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

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

+0

谢谢你的回答/按顺序理解你的想法,但我的OCaml知识并不深入。我如何填写将包含频道的参考文献或数组?一些例子,如果你不复杂。 – Dzega

+0

我扩展了我的答案,但可能你应该认为你确实需要数组或可变性...... – camlspotter

+0

描述使用你的变体的attepmts。你写这里是不正确的使用变异或数组。那么,我可以用什么来代替这个?我需要在通过telnet连接到PVP游戏井字游戏的两个用户之间切换。 – Dzega