Инициализировать массив пустым пользовательским типом OCAML

я настроил пользовательский тип данных

type vector = {a:float;b:float};

и я хочу инициализировать массив векторного типа, но ничего не содержащий, просто пустой массив длины x.

следующее

let vecarr = Array.create !max_seq_length {a=0.0;b=0.0}

делает инициализацию массива {a=0;b=0} , и оставление его пустым дает мне ошибки. Возможно ли то, что я пытаюсь сделать?


person Faisal Abid    schedule 19.10.2009    source источник
comment
Что не так с вашим примером? Мне это кажется вполне разумным. Я предполагаю, что некоторое намерение или точка зрения на почему это плохо было бы полезно. Но обычно это делается так: или с использованием опциональных типов. акцент.   -  person nlucaroni    schedule 20.10.2009


Ответы (3)


У вас не может быть неинициализированного массива в OCaml. Но посмотрите на это так: у вас никогда не будет трудно воспроизводимой ошибки в вашей программе, вызванной неинициализированными значениями.

Если значения, которые вы в конечном итоге хотите поместить в свой массив, еще недоступны, возможно, вы создаете массив слишком рано? Рассмотрите возможность использования Array.init для его создания именно в тот момент, когда доступны необходимые входные данные, без необходимости создавать его раньше и оставлять его временно неинициализированным.

Функция Array.init принимает в качестве аргумента функцию, которую она использует для вычисления начального значения каждой ячейки.

person Pascal Cuoq    schedule 21.10.2009

Как у вас может быть ничего? Когда вы извлекаете элемент только что инициализированного массива, вы должны получить что-то, верно? Что вы ожидаете получить?

Если вы хотите иметь возможность выразить способность значения быть либо недопустимым, либо некоторым значением некоторого типа, вы можете использовать тип option, значения которого либо None, либо Some value:

let vecarr : vector option array = Array.create !max_seq_length None

match vecarr.(42) with
  None -> doSomething
| Some x -> doSomethingElse
person newacct    schedule 19.10.2009

Вы можете инициализировать и 'массив, используя пустой массив, т. е. [||]. Выполнение:

let a = [||];;

оценивается как:

val a : 'a array = [||]

к которому вы затем можете добавить. Он имеет длину 0, поэтому вы ничего не можете установить, но для академических целей это может быть полезно.

person profase    schedule 31.03.2012