2010-05-25 67 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;;