2012-06-16 4 views
8

В C# и Java байтовый массив может быть создан как этотСоздать массив с динамическим размером в F #

byte[] b = new byte[x]; 

где x обозначает размер массива. Я хочу сделать то же самое в F #. Я искал, как это сделать, и посмотрел его в документации. Я думаю, что, вероятно, я использую неправильные условия поиска, потому что я не могу понять, как это сделать.

То, что я нашел до сих пор является то, что Array.create можно использовать так:

let b = Array.create x (new Byte()) 

Есть еще один способ сделать это, который более похож на то, как это может быть сделано в C# и Java?

ответ

5

Я думаю, что вы хотите создать неинициализированный массив и заполнить его позже:

let arr = Array.zeroCreate 10 
for i in 0..9 do 
    arr.[i] <- byte(i*i) 

Это так, как вы обычно делаете в C#/Java, которая unidiomatic в F #. Думаю об этом; если вы забудете инициализировать некоторые элементы, вам придется иметь дело с ночными кошмарами .

Почти во всех случаях, вы всегда можете заменить описанную выше процедуру с помощью функций высокого порядка из Array module или массива понимания:

let arr = Array.init 10 (fun i -> byte(i*i)) 

или

let arr = [| for i in 0..9 do -> byte(i*i)|] 

Взгляните на this MSDN page; он содержит полезную информацию об использовании массива в F #.

+3

Какие «нулевые кошмары»? И Java, и C# неявно инициализируют элементы байтового массива байтам со значением 0. –

+2

Я имел в виду использование 'Array.zeroCreate' с объектами в целом. В этом конкретном случае нет проблем. – pad

-1

Что вы имеете в виду?

F # имеет синтаксис, отличный от C# и Java, вы используете Array модуль, чтобы позволить ему создать массив с инициализатором. Ничего странного, один язык является функциональным, а другой - обязательным, поэтому эти различия действительно необходимы. не

Согласно F языка спецификации # вы не можете объявить что-то инициализируется (если с использованием конкретных шаблонов как Option типа, которые только эксплойты, которые позволяют выразить неинициализированную концепцию без действительно иметь его), поэтому вам нужно передать инициализатор для элементов в массиве.

+1

«* Согласно спецификации # языка F вы не можете объявить что-то, что UNINITIALIZED *» Эх, 'Unchecked.defaultof <> и' Array.zeroCreate' хотел бы поговорить с вами .. . – ildjarn

+1

Это предостережение, позволяющее использовать язык, который не предназначен для использования таким образом. 'Unchecked.defaultof ' - значение «нуль», необходимое для взаимодействия с платформой .NET, вы никогда не должны использовать его, хотя это должно быть ненужным на функциональном языке. Тот факт, что это законно, не означает, что это предлагается или разработано философией языка. – Jack

+1

Есть разница между «can» и «can not». – ildjarn

7

теснейшей F # аналог будет Array.zeroCreate:

let b: byte [] = Array.zeroCreate x 

Вместо неявной инициализации элементов массива в 0 байт на Java и C# платформы F # делает начальное значение элементов массива очевидным.

Как dynamic size из b в F # это определяется один раз x значение при распределении и не могут быть изменены позже путем изменения x, аналогично C#/Java ,.

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