13

在 C# 和 Java 中,可以像这样创建字节数组

byte[] b = new byte[x];

其中x表示数组的大小。我想做的是在 F# 中做同样的事情。我已经搜索了如何做到这一点并在文档中寻找它。我认为我可能使用了错误的搜索词,因为我不知道怎么做。

到目前为止,我发现Array.create可以这样使用:

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

有没有另一种更类似于在 C# 和 Java 中完成的方法?

4

4 回答 4

17

最接近的 F# 模拟是Array.zeroCreate:

let b: byte [] = Array.zeroCreate x

在 Java 和 C# 平台上,F#不是将数组元素隐式初始化为0字节,而是使数组元素的初始值显而易见。

在F#dynamic sizeb,它在分配时由x值定义一次,以后不能通过更改来更改x,类似于 C#/Java。

于 2012-06-16T14:01:17.090 回答
9
let b = Array.create<byte> x 0uy  //Array.zeroCreate<byte> x
于 2012-06-16T18:32:00.123 回答
7

我想你会想要创建一个未初始化的数组并稍后填充它:

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

这是您通常在 C#/Java 中执行的方式,这在 F# 中是通用的。想想看;如果您忘记初始化某些元素,则必须处理null噩梦。

在几乎所有情况下,您总是可以用Array 模块或数组理解中的高阶函数替换上述过程:

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

或者

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

看看这个 MSDN 页面;它包含有关在 F# 中使用 Array 的有用信息。

于 2012-06-16T14:26:43.873 回答
-1

你什么意思?

F#的语法与C#Java不同,您正在使用该Array模块让他使用初始化程序创建一个数组。没什么奇怪的,一种语言是功能性的,而另一种是必要的,因此确实需要这些差异。

根据F#语言规范,您不能声明未初始化的内容(除非使用特定模式作为Option类型,这只是允许您在没有真正拥有的情况下表达未初始化概念的漏洞),这就是为什么您必须为数组中的元素。

于 2012-06-16T13:50:48.137 回答