2012-06-16 34 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,它是在F#unidiomatic的方式。想想看,如果你忘記初始化一些元素,你必須處理null噩夢。

在幾乎所有情況下,你總是可以從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#中使用Array的有用信息。

+3

什麼「'null'噩夢」? Java和C#都會隱式地將字節數組的元素初始化爲值爲0的字節。 –

+2

我的意思是將'Array.zeroCreate'與一般對象一起使用。這個具體情況沒有問題。 – pad

-1

你是什麼意思?

F#具有C#不同的Java,您使用的是Array模塊讓他創建一個初始化數組中的語法。沒有什麼奇怪的,一種語言是功能性的,而另一種語言是必要的,所以確實需要這些差異。

按照F#語言規範不能聲明的東西是未初始化(除非使用特定的圖案作爲Option型這只是攻擊,讓你表達沒有真正擁有它未初始化的概念),這就是爲什麼你必須爲數組中的元素傳遞一個初始化器。

+1

「*根據F#語言規範,你不能宣佈的東西,未初始化*」嗯,'Unchecked.defaultof <>'和'Array.zeroCreate'想有話你.. – ildjarn

+1

這是一個告誡,讓你利用一種並不意味着以這種方式使用的語言。 'Unchecked.defaultof '是與.NET框架互操作性所需的'null'值,你不應該使用它,因爲它在功能語言中應該是不必要的。合法的事實並不意味着這是由語言哲學提出或設計的。 – Jack

+1

「can」和「can not」之間有區別。 – ildjarn

7

甲接近F#模擬將是Array.zeroCreate:

let b: byte [] = Array.zeroCreate x 

相反的隱式陣列元件初始化到Java和C#平臺F#0字節使陣列元件明顯的初始值。

至於在F#bdynamic size它由x值在分配定義一次並且不能被改變x後來改變,類似於C#/爪哇,.

7
let b = Array.create<byte> x 0uy //Array.zeroCreate<byte> x