Учебники

F # — Массивы

Массивы — это изменяемые наборы последовательных элементов данных фиксированного размера, начинающиеся с нуля, которые относятся к одному и тому же типу.

Создание массивов

Вы можете создавать массивы, используя различные синтаксисы и способы, или используя функции из модуля Array. В этом разделе мы обсудим создание массивов без использования функций модуля.

Существует три синтаксических способа создания массивов без функций —

  • Перечисляя последовательные значения между [| и |] и разделенные точкой с запятой.
  • Размещая каждый элемент на отдельной строке, в этом случае точка с запятой является необязательной.
  • Используя выражения последовательности.

Вы можете получить доступ к элементам массива, используя оператор точки (.) И скобки ([и]).

Следующий пример демонстрирует создание массивов —

Live Demo

//using semicolon separator
let array1 = [| 1; 2; 3; 4; 5; 6 |]
for i in 0 .. array1.Length - 1 do
   printf "%d " array1.[i]
printfn" "

// without semicolon separator
let array2 =
   [|
      1
      2
      3
      4
      5
   |]
for i in 0 .. array2.Length - 1 do
   printf "%d " array2.[i]
printfn" "

//using sequence
let array3 = [| for i in 1 .. 10 -> i * i |]
for i in 0 .. array3.Length - 1 do
   printf "%d " array3.[i]
printfn" "

Когда вы компилируете и запускаете программу, она выдает следующий вывод:

1 2 3 4 5 6
1 2 3 4 5
1 4 9 16 25 36 49 64 81 100

Основные операции над массивами

Модуль библиотеки Microsoft.FSharp.Collections.Array поддерживает операции с одномерными массивами.

В следующей таблице приведены основные операции над массивами:

Значение Описание
добавьте: ‘T [] →’ T [] → ‘T [] Создает массив, который содержит элементы одного массива, за которыми следуют элементы другого массива.
среднее: ^ T [] → ^ T Возвращает среднее значение элементов в массиве.
AverageBy: (‘T → ^ U) →’ T [] → ^ U Возвращает среднее значение элементов, сгенерированных путем применения функции к каждому элементу массива.
blit: ‘T [] → int →’ T [] → int → int → unit Читает диапазон элементов из одного массива и записывает их в другой.
выберите: (опция ‘T → U) →’ T [] → ‘U [] Применяет предоставленную функцию к каждому элементу массива. Возвращает массив, содержащий результаты x для каждого элемента, для которого функция возвращает Some (x).
собрать: (‘T →’ U []) → T [] → ‘U [] Применяет предоставленную функцию к каждому элементу массива, объединяет результаты и возвращает объединенный массив.
concat: seq <‘T []> →’ T [] Создает массив, который содержит элементы каждой из предоставленных последовательностей массивов.
копия: ‘T →’ T [] Создает массив, который содержит элементы предоставленного массива.
создать: int → ‘T →’ T [] Создает массив, все элементы которого изначально имеют заданное значение.
пусто: ‘T [] Возвращает пустой массив данного типа.
существует: (‘T → bool) →’ T [] → bool Проверяет, удовлетворяет ли какой-либо элемент массива предоставленному предикату.
существует2: (‘T1 →’ T2 → bool) → ‘T1 [] →’ T2 [] → bool Проверяет, удовлетворяет ли любая пара соответствующих элементов двух массивов указанному условию.
заполните: ‘T [] → int → int →’ T → единица Заполняет диапазон элементов массива предоставленным значением.
фильтр: (‘T → bool) →’ T [] → ‘T [] Возвращает коллекцию, которая содержит только элементы предоставленного массива, для которого предоставленное условие возвращает true .
найти: (‘T → bool) →’ T [] → ‘T Возвращает первый элемент, для которого предоставленная функция возвращает true . Вызывает KeyNotFoundException, если такого элемента не существует.
findIndex: (‘T → bool) →’ T [] → int Возвращает индекс первого элемента в массиве, который удовлетворяет заданному условию. Вызывает KeyNotFoundException, если ни один из элементов не удовлетворяет условию.
свернуть: (‘State →’ T → ‘State) →’ State → ‘T [] →’ State Применяет функцию к каждому элементу массива, пропуская аргумент аккумулятора через вычисления. Если входной функцией является f, а элементами массива i0 … iN, эта функция вычисляет f (… (fs i0) …) iN.
fold2: (‘State →’ T1 → ‘T2 →’ State) → ‘State →’ T1 [] → ‘T2 [] →’ State Применяет функцию к парам элементов из двух предоставленных массивов слева направо, пропуская аргумент аккумулятора через вычисления. Два входных массива должны иметь одинаковую длину; в противном случае ArgumentException повышается.
foldBack: (‘T →’ State → ‘State) →’ T [] → ‘State →’ State Применяет функцию к каждому элементу массива, пропуская аргумент аккумулятора через вычисления. Если входной функцией является f, а элементами массива i0 … iN, эта функция вычисляет f i0 (… (f iN s)).
foldBack2: (‘T1 →’ T2 → ‘State →’ State) → ‘T1 [] →’ T2 [] → ‘State →’ State Применяет функцию к парам элементов из двух предоставленных массивов справа налево, пропуская аргумент аккумулятора через вычисления. Два входных массива должны иметь одинаковую длину; в противном случае ArgumentException повышается.
forall: (‘T → bool) →’ T [] → bool Проверяет, все ли элементы массива удовлетворяют предоставленному условию.
forall2: (‘T1 →’ T2 → bool) → ‘T1 [] →’ T2 [] → bool Проверяет, все ли соответствующие элементы двух предоставленных массивов удовлетворяют предоставленному условию.
получить: ‘T [] → int →’ T Получает элемент из массива.
init: int → (int → ‘T) →’ T [] Использует предоставленную функцию для создания массива предоставленного измерения.
isEmpty: ‘T [] → bool Проверяет, есть ли в массиве какие-либо элементы.
iter: (‘T → единица) →’ T [] → единица Применяет предоставленную функцию к каждому элементу массива.
iter2: (‘T1 →’ T2 → единица) → ‘T1 [] →’ T2 [] → единица) Применяет предоставленную функцию к паре элементов из совпадающих индексов в двух массивах. Два массива должны иметь одинаковую длину; в противном случае ArgumentException повышается.
iteri: (int → ‘T → unit) →’ T [] → unit Применяет предоставленную функцию к каждому элементу массива. Целое число, переданное функции, указывает индекс элемента.
iteri2: (int → ‘T1 →’ T2 → единица измерения) → ‘T1 [] →’ T2 [] → единица измерения Применяет предоставленную функцию к паре элементов из соответствующих индексов в двух массивах, также передавая индекс элементов. Два массива должны иметь одинаковую длину; в противном случае возникает ArgumentException.
длина: ‘T [] → int Возвращает длину массива. Свойство Length делает то же самое.
карта: (‘T →’ U) → ‘T [] →’ U [] Создает массив, элементы которого являются результатами применения предоставленной функции к каждому из элементов предоставленного массива.
map2: (‘T1 →’ T2 → ‘U) →’ T1 [] → ‘T2 [] →’ U [] Создает массив, элементы которого являются результатами применения предоставленной функции к соответствующим элементам двух предоставленных массивов. Два входных массива должны иметь одинаковую длину; в противном случае ArgumentException повышается.
mapi: (int → ‘T →’ U) → ‘T [] →’ U [] Создает массив, элементы которого являются результатами применения предоставленной функции к каждому из элементов предоставленного массива. Целочисленный индекс, переданный функции, указывает на индекс преобразуемого элемента.
mapi2: (int → ‘T1 →’ T2 → ‘U) →’ T1 [] → ‘T2 [] →’ U [] Создает массив, элементы которого являются результатами применения предоставленной функции к соответствующим элементам двух коллекций попарно, также передавая индекс элементов. Два входных массива должны иметь одинаковую длину; в противном случае ArgumentException повышается.
max: ‘T [] →’ T Возвращает самый большой из всех элементов массива. Operators.max используется для сравнения элементов.
maxBy: (‘T →’ U) → ‘T [] →’ T Возвращает наибольший из всех элементов массива по сравнению с Operators.max для результата функции.
мин: (‘T [] →’ T Возвращает наименьший из всех элементов массива. Operators.min используется для сравнения элементов.
minBy: (‘T →’ U) → ‘T [] →’ T Возвращает наименьший из всех элементов массива. Operators.min используется для сравнения элементов.
ofList: ‘T list →’ T [] Создает массив из предоставленного списка.
ofSeq: seq <‘T> →’ T [] Создает массив из предоставленного перечисляемого объекта.
раздел: (‘T → bool) →’ T [] → ‘T [] *’ T [] Разбивает массив на два массива, один из которых содержит элементы, для которых указанное условие возвращает true, а другой — те, для которых он возвращает false .
перестановка: (int → int) → ‘T [] →’ T [] Переставляет элементы массива в соответствии с указанной перестановкой.
выберите: (опция ‘T →’ U) → ‘T [] →’ U Применяет предоставленную функцию к последовательным элементам предоставленного массива, возвращая первый результат, где функция возвращает Some (x) для некоторого x. Если функция никогда не возвращает Some (x), вызывается KeyNotFoundException.
уменьшить: (‘T →’ T → ‘T) →’ T [] → ‘T Применяет функцию к каждому элементу массива, пропуская аргумент аккумулятора через вычисления. Если входной функцией является f, а элементами массива i0 … iN, эта функция вычисляет f (… (f i0 i1) …) iN. Если массив имеет нулевой размер, ArgumentException повышается.
ReduckBack: (‘T →’ T → ‘T) →’ T [] → ‘T Применяет функцию к каждому элементу массива, пропуская аргумент аккумулятора через вычисления. Если входная функция — f, а элементы — i0 … iN, эта функция вычисляет f i0 (… (f iN-1 iN)). Если массив имеет нулевой размер, ArgumentException повышается.
rev: ‘T [] →’ T [] Меняет порядок элементов в предоставленном массиве.
сканирование: (‘State →’ T → ‘State) →’ State → ‘T [] →’ State []) Ведет себя как фолд, но возвращает промежуточные результаты вместе с окончательными результатами.
scanBack: (‘T →’ State → ‘State) →’ T [] → ‘State →’ State [] Ведет себя как foldBack, но возвращает промежуточные результаты вместе с окончательными результатами.
установить: ‘T [] → int →’ T → единица Устанавливает элемент массива.
сортировка: ‘T [] →’ T [] Сортирует элементы массива и возвращает новый массив. Operators.compare используется для сравнения элементов.
sortBy: (‘T →’ Key) → ‘T [] →’ T [] Сортирует элементы массива с помощью предоставленной функции для преобразования элементов в тип, на котором основана операция сортировки, и возвращает новый массив. Operators.compare используется для сравнения элементов.
sortInPlace: ‘T [] → единица Сортирует элементы массива, изменяя массив на месте, используя предоставленную функцию сравнения. Operators.compare используется для сравнения элементов.
sortInPlaceBy: (‘T →’ Key) → ‘T [] → unit Сортирует элементы массива, изменяя массив на месте, используя предоставленную проекцию для ключей. Operators.compare используется для сравнения элементов.
sortInPlaceWith: (‘T →’ T → int) → ‘T [] → единица Сортирует элементы массива, используя предоставленную функцию сравнения, чтобы изменить массив на месте.
sortWith: (‘T →’ T → int) → ‘T [] →’ T [] Сортирует элементы массива с помощью предоставленной функции сравнения и возвращает новый массив.
sub: ‘T [] → int → int →’ T [] Создает массив, который содержит предоставленный поддиапазон, который определяется начальным индексом и длиной.
сумма: ‘T [] → ^ T Возвращает сумму элементов в массиве.
sumBy: (‘T → ^ U) →’ T [] → ^ U Возвращает сумму результатов, созданных путем применения функции к каждому элементу массива.
toList: ‘T [] →’ T list Преобразует предоставленный массив в список.
toSeq: ‘T [] → seq <‘ T> Рассматривает предоставленный массив как последовательность.
tryFind: (‘T → bool) → опция’ T [] → ‘T Возвращает первый элемент в предоставленном массиве, для которого предоставленная функция возвращает true . Возвращает None, если такого элемента не существует.
tryFindIndex: (‘T → bool) →’ T [] → int option Возвращает индекс первого элемента в массиве, который удовлетворяет заданному условию.
tryPick: (опция ‘T →’ U) → опция ‘T [] →’ U Применяет предоставленную функцию к последовательным элементам предоставленного массива и возвращает первый результат, где функция возвращает Some (x) для некоторого x. Если функция никогда не возвращает Some (x), None возвращается.
распаковать: (‘T1 *’ T2) [] → ‘T1 [] *’ T2 [] Разбивает массив пар кортежей на кортеж из двух массивов.
распаковать3: (‘T1 *’ T2 * ‘T3) [] →’ T1 [] * ‘T2 [] *’ T3 [] Разбивает массив кортежей из трех элементов на кортеж из трех массивов.
zeroCreate: int → ‘T [] Создает массив, элементы которого изначально установлены в значение по умолчанию Unchecked.defaultof <‘T>.
zip: ‘T1 [] →’ T2 [] → (‘T1 *’ T2) [] Объединяет два массива в массив кортежей, которые имеют два элемента. Два массива должны иметь одинаковую длину; в противном случае ArgumentException повышается.
zip3: ‘T1 [] →’ T2 [] → ‘T3 [] → (‘ T1 * ‘T2 * 113’ T3) [] Объединяет три массива в массив кортежей, которые имеют три элемента. Три массива должны иметь одинаковую длину; в противном случае ArgumentException повышается.

В следующем разделе мы увидим использование некоторых из этих функций.

Создание массивов с использованием функций

Модуль Array предоставляет несколько функций, которые создают массив с нуля.

  • Функция Array.empty создает новый пустой массив.

  • Функция Array.create создает массив указанного размера и устанавливает для всех элементов заданные значения.

  • Функция Array.init создает массив с заданным размером и функцией для генерации элементов.

  • Функция Array.zeroCreate создает массив, в котором все элементы инициализируются нулевым значением.

  • Функция Array.copy создает новый массив, содержащий элементы, которые копируются из существующего массива.

  • Функция Array.sub генерирует новый массив из поддиапазона массива.

  • Функция Array.append создает новый массив путем объединения двух существующих массивов.

  • Функция Array.choose выбирает элементы массива для включения в новый массив.

  • Функция Array.collect запускает указанную функцию для каждого элемента массива существующего массива, а затем собирает элементы, сгенерированные функцией, и объединяет их в новый массив.

  • Функция Array.concat берет последовательность массивов и объединяет их в один массив.

  • Функция Array.filter принимает булеву функцию условия и генерирует новый массив, который содержит только те элементы из входного массива, для которых условие выполняется.

  • Функция Array.rev генерирует новый массив, изменяя порядок существующего массива.

Функция Array.empty создает новый пустой массив.

Функция Array.create создает массив указанного размера и устанавливает для всех элементов заданные значения.

Функция Array.init создает массив с заданным размером и функцией для генерации элементов.

Функция Array.zeroCreate создает массив, в котором все элементы инициализируются нулевым значением.

Функция Array.copy создает новый массив, содержащий элементы, которые копируются из существующего массива.

Функция Array.sub генерирует новый массив из поддиапазона массива.

Функция Array.append создает новый массив путем объединения двух существующих массивов.

Функция Array.choose выбирает элементы массива для включения в новый массив.

Функция Array.collect запускает указанную функцию для каждого элемента массива существующего массива, а затем собирает элементы, сгенерированные функцией, и объединяет их в новый массив.

Функция Array.concat берет последовательность массивов и объединяет их в один массив.

Функция Array.filter принимает булеву функцию условия и генерирует новый массив, который содержит только те элементы из входного массива, для которых условие выполняется.

Функция Array.rev генерирует новый массив, изменяя порядок существующего массива.

Следующие примеры демонстрируют эти функции —

Пример 1

Live Demo

(* using create and set *)
let array1 = Array.create 10 ""
for i in 0 .. array1.Length - 1 do
   Array.set array1 i (i.ToString())
for i in 0 .. array1.Length - 1 do
   printf "%s " (Array.get array1 i)
printfn " "

(* empty array *)
let array2 = Array.empty
printfn "Length of empty array: %d" array2.Length

let array3 = Array.create 10 7.0
printfn "Float Array: %A" array3

(* using the init and zeroCreate *)
let array4 = Array.init 10 (fun index -> index * index)
printfn "Array of squares: %A" array4

let array5 : float array = Array.zeroCreate 10
let (myZeroArray : float array) = Array.zeroCreate 10
printfn "Float Array: %A" array5

Когда вы компилируете и запускаете программу, она выдает следующий вывод:

0 1 2 3 4 5 6 7 8 9
Length of empty array: 0
Float Array: [|7.0; 7.0; 7.0; 7.0; 7.0; 7.0; 7.0; 7.0; 7.0; 7.0|]
Array of squares: [|0; 1; 4; 9; 16; 25; 36; 49; 64; 81|]
Float Array: [|0.0; 0.0; 0.0; 0.0; 0.0; 0.0; 0.0; 0.0; 0.0; 0.0|]

Пример 2

Live Demo

(* creating subarray from element 5 *)
(* containing 15 elements thereon *)

let array1 = [| 0 .. 50 |]
let array2 = Array.sub array1 5 15
printfn "Sub Array:"
printfn "%A" array2

(* appending two arrays *)
let array3 = [| 1; 2; 3; 4|]
let array4 = [| 5 .. 9 |]
printfn "Appended Array:"
let array5 = Array.append array3 array4
printfn "%A" array5

(* using the Choose function *)
let array6 = [| 1 .. 20 |]
let array7 = Array.choose (fun elem -> if elem % 3 = 0 then
   Some(float (elem))
      else
   None) array6

printfn "Array with Chosen elements:"
printfn "%A" array7

(*using the Collect function *)
let array8 = [| 2 .. 5 |]
let array9 = Array.collect (fun elem -> [| 0 .. elem - 1 |]) array8
printfn "Array with collected elements:"
printfn "%A" array9

Когда вы компилируете и запускаете программу, она выдает следующий вывод:

Sub Array:
[|5; 6; 7; 8; 9; 10; 11; 12; 13; 14; 15; 16; 17; 18; 19|]
Appended Array:
[|1; 2; 3; 4; 5; 6; 7; 8; 9|]
Array with Chosen elements:
[|3.0; 6.0; 9.0; 12.0; 15.0; 18.0|]
Array with collected elements:
[|0; 1; 0; 1; 2; 0; 1; 2; 3; 0; 1; 2; 3; 4|]

Поиск массивов

Функция Array.find принимает логическую функцию и возвращает первый элемент, для которого функция возвращает значение true, в противном случае возникает исключение KeyNotFoundException.

Функция Array.findIndex работает аналогично, за исключением того, что она возвращает индекс элемента вместо самого элемента.

Следующий пример демонстрирует это.

Microsoft предоставляет этот интересный пример программы, который находит первый элемент в диапазоне заданного числа, который является как идеальным квадратом, так и идеальным кубом —

Live Demo

let array1 = [| 2 .. 100 |]
let delta = 1.0e-10
let isPerfectSquare (x:int) =
   let y = sqrt (float x)
   abs(y - round y) < delta

let isPerfectCube (x:int) =
   let y = System.Math.Pow(float x, 1.0/3.0)
   abs(y - round y) < delta

let element = Array.find (fun elem -> isPerfectSquare elem && isPerfectCube elem) array1

let index = Array.findIndex (fun elem -> isPerfectSquare elem && isPerfectCube elem) array1

printfn "The first element that is both a square and a cube is %d and its index is %d." element index

Когда вы компилируете и запускаете программу, она выдает следующий вывод: