2010-05-25 68 views
14

'a[,,]'a[][][]有什麼區別?它們都代表三維陣列。 它使我寫array3d.[x].[y].[z]而不是array3d.[x, y, z]F#多維陣列類型

爲什麼我不能做到以下幾點?

> let array2d : int[,] = Array2D.zeroCreate 10 10;; 
> let array1d = array2d.[0];; 

error FS0001: This expression was expected to have type 
    'a []  
but here has type 
    int [,] 

回答

32

的區別在於'a[][]代表(可能不同的長度)數組的數組,而在'a[,],表示矩形二維數組。第一種類型也被稱爲鋸齒狀陣列,第二種稱爲多維陣列。與C#中的區別相同,因此您可能需要查看jagged arraysmultidimensional arrays的C#文檔。 F# WikiBook也有一個非常好的文檔。

爲了證明這一點使用圖片,'a[][]類型的值可以是這樣的:

0 1 2 3 4 
5 6 
7 8 9 0 1 

雖然a[,]類型的值將始終是一個矩形,並可能看起來例如是這樣的:

0 1 2 3 
4 5 6 7 
8 9 0 1 

爲了得到多維數組的一個「行」,你可以使用片符號

let array1d = array2d.[0..0,0..9];; 

切片實際上返回多維陣列(在此情況下,與一個尺寸等於1),所以可以編寫返回'a[]這樣的變換函數:

let toArray (arr:_[,]) = 
    Array.init arr.Length (fun i -> arr.[0, i]) 

let array1d = array2d.[0..0,0..9] |> toArray;;