Типы многомерных массивов F #

В чем разница между '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 [,]

Ответы

Ответ 1

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