2011-07-02 101 views
2

我正在操作Ocaml中的二維數組。我有一些問題:Ocaml中的數組操作

1)如何聲明一個長度爲int64而不是int的數組?例如,Array.make : int -> 'a -> 'a array,如果我需要一個索引類型爲int64的較大陣列,該怎麼辦?

2)我可以寫類似以下內容:

let array = Array.make_matrix 10 10 0 in 
array.(1).(2) <- 5; array.(3).(4) <- 20; (* where I modify a part of values in array) 
f array ... 
... 

上面的代碼在我看來不自然,因爲我們修改的arraylet裏面的價值,我必須這樣,還是有更自然的方式來做到這一點?

任何人都可以幫忙嗎?非常感謝你!

回答

4

在64位系統上,陣列模塊的OCaml陣列大小限制爲2^54-1,在32位系統上限制爲4,194,303。對於浮點數組,極限值減小2倍。在這兩種情況下,索引都很容易表示爲int,因此使用int64作爲索引沒有任何優勢。

對於32位系統的值是方式對於某些問題太小,所以有另一個名爲Bigarray的模塊可以代表更大的數組。它支持更大的數組,但索引仍然是int。如果你真的需要有大的索引,你可能在64位系統上,這不是一個限制。如果沒有的話,無論如何,你會用盡地址空間,我會想。也許你真正想要的是一個哈希表?

我不確定你在說什麼「let」。讓的目的是給一個名字。在開始存儲數值之前給數組賦一個名字並不是不合理的。如果你想在創建數組的時候定義這些值,你可以使用Array.init並編寫一個任意函數來設置數組值。

OCaml中的數組代碼本質上是勢在必行的,所以通常你最終會看到它的代碼。我經常使用beginend,只是擁抱它的Algolic品質。