Между чем различие 'a[,,]
и 'a[][][]
? Они оба представляют 3-и массивы. Это заставляет меня записать array3d.[x].[y].[z]
вместо array3d.[x, y, z]
.
Почему я не могу сделать следующего?
> 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 [,]
Разница в том, что 'a[][]
представляет массив массивов (возможно, разной длины), а в 'a[,]
- прямоугольный двумерный массив. Первый тип также называется рваные массивы, а второй тип - многомерные массивы. Разница такая же, как и в C#, поэтому вы можете посмотреть документацию по 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
Чтобы получить одну "строку" многомерного массива, можно использовать нотацию slice:
let row = array2d.[0,*];;