2015-11-03 2 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 со стоимостью проверки времени исполнения Some и None.

Если вы можете использовать фиктивное значение канала затем,

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 

BTW, входные каналы и выходные каналы имеют разные типы, поэтому вы не можете вставлять их в один массив. Вероятно, вы должны использовать здесь несколько ссылок от 'mode channel ref вместо одного массива.

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

Непонятно, почему вопросник нуждается в изменчивости здесь. Вероятно, правильный ответ - не использовать их вообще.

+0

Спасибо за ваш ответ/Поймите свою идею в порядке, но мои знания OCaml не глубоки. Как я могу заполнить refs или массивы, которые будут содержать каналы? Например, если вы не усложняете. – Dzega

+0

Я продлил свой ответ, но, вероятно, вам следует подумать, что вам действительно нужны массивы или изменчивость ... – camlspotter

+0

Описанные варианты использования ваших вариантов. Вы пишете, что здесь неправильно использовать переменные или массивы. Итак, что я могу использовать вместо этого? Мне нужно переключиться между двумя пользователями, подключенными по telnet, к игре tic tac. – Dzega

Смежные вопросы