F # Многомерные типы массивов - PullRequest
17 голосов
/ 26 мая 2010

В чем разница между 'a[,,] и 'a[][][]? Они оба представляют собой трехмерные массивы. Это заставляет меня писать 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 [,]

Ответы [ 2 ]

35 голосов
/ 26 мая 2010

Разница в том, что 'a[][] представляет массив массивов (возможно, различной длины), тогда как в 'a[,] представляет прямоугольный 2D-массив. Первый тип также называется зубчатыми массивами , а второй тип называется многомерными массивами . Разница та же, что и в 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

Чтобы получить одну «строку» многомерного массива, вы можете использовать обозначение среза :

let row = array2d.[0,*];;

См. https://docs.microsoft.com/en-us/dotnet/fsharp/language-reference/arrays#array-slicing-and-multidimensional-arrays

2 голосов
/ 24 мая 2018

Начиная с F # 3.1 (2013) все проще:

Начиная с F # 3.1, вы можете разложить многомерный массив на подмассивы того же или более низкого измерения. Например, вы можете получить вектор из матрицы, указав одну строку или столбец.

// Get row 3 from a matrix as a vector:
matrix.[3, *]

// Get column 3 from a matrix as a vector:
matrix.[*, 3]

См. https://docs.microsoft.com/en-us/dotnet/fsharp/language-reference/arrays#array-slicing-and-multidimensional-arrays

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...