Существует два варианта в зависимости от того, используете ли вы фактический 2D-массив (прямоугольный массив) или зубчатый массив (массив, элементы которого являются массивами, возможно различной длины):
Если вы не уверены, какой из них использовать, то полезно знать, что зубчатые массивы быстрее, но может быть проще работать с прямоугольными массивами (потому что вы уверены в размерах).
let foo (ar:bool[,]) = ar.[0, 0] // Get element at specified coordinates
let bar (ar:bool[][]) = ar.[0].[0] // Get first array and then the element
Для вызова двух функций вы можете использовать следующий синтаксис:
// Create array of arrays and call the function
bar [| [| true |] |]
// Creates array of arrays and converts it to multi-dimensional array
// You can also use plenty of functions from 'Array2D' module
foo (array2D [| [| true |] |])
Если вы хотите написать функцию, которая будет более общей, вы также можете использовать последовательность последовательностей. Это будет совместимо только с зубчатыми массивами, но вы также можете использовать эту функцию, например, с. F # списки списков или любые типы коллекций .NET.
let woo (ar:seq<#seq<bool>>) = Seq.head (Seq.head ar)
Тип #seq<..>
означает, что это может быть последовательность или любой другой производный тип. Это необходимо для типа элемента, но не для внешнего типа, потому что F # автоматически приводит внешний тип (но не элементы).