F # - Наборы

Набор в F # - это структура данных, которая действует как набор элементов без сохранения порядка, в котором элементы вставляются. Наборы не позволяют вставлять повторяющиеся записи в коллекцию.

Создание наборов

Наборы могут быть созданы следующими способами -

  • Создав пустой набор с помощью Set.empty и добавив элементы с помощью функции добавления.
  • Преобразование последовательностей и списков в наборы.

Следующая программа демонстрирует методы -

(* creating sets *)
let set1 = Set.empty.Add(3).Add(5).Add(7). Add(9)
printfn"The new set: %A" set1

let weekdays = Set.ofList ["mon"; "tues"; "wed"; "thurs"; "fri"]
printfn "The list set: %A" weekdays

let set2 = Set.ofSeq [ 1 .. 2.. 10 ]
printfn "The sequence set: %A" set2

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

The new set: set [3; 5; 7; 9]
The list set: set ["fri"; "mon"; "thurs"; "tues"; "wed"]
The sequence set: set [1; 3; 5; 7; 9]

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

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

Значение Описание
добавить: 'T → Установить <' T> → Установить <'T> Возвращает новый набор с добавленным к нему элементом. Исключение не возникает, если набор уже содержит данный элемент.
содержит: 'T → Set <' T> → bool Оценивает true если данный элемент находится в данном наборе.
count: Set <'T> → int Возвращает количество элементов в наборе.
разница: Установить <'T> → Установить <' T> → Установить <'T> Возвращает новый набор, в котором элементы второго набора удалены из первого.
пустой: Установить <'T> Пустой набор для указанного типа.
существует: ('T → bool) → Set <' T> → bool Проверяет, удовлетворяет ли какой-либо элемент коллекции заданному предикату. Если входная функция является предикатом, а элементы - i0 ... iN, то эта функция вычисляет предикат i0 или ... или предикат iN.
фильтр: ('T → bool) → Установить <' T> → Установить <'T> Возвращает новую коллекцию, содержащую только элементы коллекции, для которой данный предикат возвращает true.
свёртка: ('Состояние →' T → 'Состояние) →' Состояние → Установить <'T> →' Состояние Применяет данную функцию накопления ко всем элементам набора.
foldBack: ('T →' Состояние → 'Состояние) → Установить <' T> → 'Состояние →' Состояние Применяет данную функцию накопления ко всем элементам набора.
forall: ('T → bool) → Установить <' T> → bool Проверяет, все ли элементы коллекции удовлетворяют заданному предикату. Если входная функция - p, а элементы - i0 ... iN, то эта функция вычисляет p i0 && ... && p iN.
пересечение: Установить <'T> → Установить <' T> → Установить <'T> Вычисляет пересечение двух наборов.
IntercctMany: seq <Установить <'T >> → Установить <' T> Вычисляет пересечение последовательности наборов. Последовательность не должна быть пустой.
isEmpty: Set <'T> → bool Возврат true если набор пуст.
isProperSubset: Установить <'T> → Установить <' T> → bool Оценивает true если все элементы первого набора находятся во втором, и хотя бы один элемент второго не находится в первом.
isProperSuperset: Установить <'T> → Установить <' T> → bool Оценивает true если все элементы второго набора находятся в первом, и хотя бы один элемент первого не находится во втором.
isSubset: Set <'T> → Set <' T> → bool Оценивает true если все элементы первого набора находятся во втором.
isSuperset: Установить <'T> → Установить <' T> → bool Оценивает true если все элементы второго набора находятся в первом.
iter: ('T → единицы) → Установить <' T> → единицы Применяет данную функцию к каждому элементу набора в порядке, соответствующем функции сравнения.
карта: ('T →' U) → Установить <'T> → Установить <' U> Возвращает новую коллекцию, содержащую результаты применения данной функции к каждому элементу входного набора.
maxElement: Установить <'T> →' T Возвращает самый высокий элемент в наборе в соответствии с порядком, используемым для набора.
minElement: Установить <'T> →' T Возвращает самый низкий элемент в наборе в соответствии с порядком, используемым для набора.
ofArray: 'T массив → Установить <' T> Создает набор, содержащий те же элементы, что и данный массив.
ofList: 'T список → Установить <' T> Создает набор, содержащий те же элементы, что и данный список.
ofSeq: seq <'T> → Установить <' T> Создает новую коллекцию из заданного перечислимого объекта.
раздел: ('T → bool) → Установить <' T> → Установить <'T> * Установить <' T> Разделяет набор на два набора, содержащих элементы, для которых данный предикат возвращает true и false соответственно.
удалить: 'T → Установить <' T> → Установить <'T> Возвращает новый набор с удаленным элементом. Исключение не возникает, если набор не содержит данный элемент.
одиночный: 'T → Установить <' T> Набор, содержащий данный элемент.
toArray: Установить массив <'T> →' T Создает массив, содержащий элементы набора по порядку.
toList: Установить список <'T> →' T Создает список, содержащий элементы набора по порядку.
toSeq: установить <'T> → seq <' T> Возвращает упорядоченное представление коллекции в виде перечислимого объекта.
объединение: Set <'T> → Set <' T> → Set <'T> Вычисляет объединение двух наборов.
unionMany: seq <Установить <'T >> → Установить <' T> Вычисляет объединение последовательности наборов.

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

пример

let a = Set.ofSeq [ 1 ..2.. 20 ]
let b = Set.ofSeq [ 1 ..3 .. 20 ]
let c = Set.intersect a b
let d = Set.union a b
let e = Set.difference a b

printfn "Set a: "
Set.iter (fun x -> printf "%O " x) a
printfn""

printfn "Set b: "
Set.iter (fun x -> printf "%O " x) b
printfn""

printfn "Set c = set intersect of a and b : "
Set.iter (fun x -> printf "%O " x) c
printfn""

printfn "Set d = set union of a and b : "
Set.iter (fun x -> printf "%O " x) d
printfn""

printfn "Set e = set difference of a and b : "
Set.iter (fun x -> printf "%O " x) e
printfn""

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

Set a:
1 3 5 7 9 11 13 15 17 19
Set b:
1 4 7 10 13 16 19
Set c = set intersect of a and b :
1 7 13 19
Set d = set union of a and b :
1 3 4 5 7 9 10 11 13 15 16 17 19
Set e = set difference of a and b :
3 5 9 11 15 17