F# - 集

F#中的一个集合是一个数据结构,它充当项目集合而不保留项目的插入顺序.集合不允许将重复条目插入集合中.

创建集合

可以通过以下方式创建集合 :

  • 使用Set.empty创建空集并使用add函数添加项.

  • 转换序列和列表到集合.

以下程序演示了技巧 :

(* 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" set22

编译并执行程序时,它会产生以下输出 :

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]

集合的基本操作

下表显示了集合和减号的基本操作;

 

描述

add : 'T &rarr; Set<'T> &rarr;   Set<'T>

返回一个新元素集,其中添加了一个元素.如果集合已经包含给定元素,则不会引发异常.

contains : 'T &rarr; Set<'T> &rarr; bool

如果给定元素在给定集合中,则求值为 true .

count : Set<'T> &rarr; int

返回集合中元素的数量.

difference : Set<'T> &rarr; Set<'T>   &rarr; Set<'T>

返回一个新集合,其中第二个集合的元素从第一个集合中删除.

empty : Set<'T>

指定类型的空集.

exists : ('T &rarr; bool) &rarr; Set<'T>   &rarr; bool

测试集合中的任何元素是否满足给定的谓词.如果输入函数是谓词且元素是i0 ... iN,则此函数计算谓词i0...或谓词iN.

filter : ('T &rarr; bool) &rarr; Set<'T>   &rarr; Set<'T>

返回一个新集合,其中仅包含给定谓词返回 true 的集合元素.

fold : ('State &rarr; 'T &rarr; 'State)   &rarr; 'State &rarr; Set<'T> &rarr; 'State

将给定的累积函数应用于集合的所有元素.

foldBack : ('T &rarr; 'State &rarr; 'State)   &rarr; Set<'T> &rarr; 'State &rarr; 'State

将给定的累积函数应用于集合的所有元素.

forall : ('T &rarr; bool) &rarr; Set<'T>   &rarr; bool

测试集合的所有元素是否满足给定的谓词.如果输入函数是p且元素是i0 ... iN,则此函数计算p i0 && ... && p iN.

intersect : Set<'T> &rarr; Set<'T>   &rarr; Set<'T>

计算两组的交集.

intersectMany : seq<Set<'T>> &rarr;   Set<'T>

计算一系列集合的交集.序列必须是非空的.

isEmpty : Set<'T> &rarr; bool

如果集合为空,则返回 true .

isProperSubset : Set<'T> &rarr; Set<'T>   &rarr; bool

如果第一组中的所有元素都在第二组中,则评估为 true ,并且第二组中的至少一个元素不在第一组中.

isProperSuperset : Set<'T> &rarr;   Set<'T> &rarr; bool

如果第二组的所有元素都在第一组,并且第一组的至少一个元素不在第二组中,则评估为 true .

isSubset : Set<'T> &rarr; Set<'T>   &rarr; bool

如果第一组的所有元素都在第二组中,则评估为 true .

isSuperset : Set<'T> &rarr; Set<'T>   &rarr; bool

如果第二组中的所有元素都在第一组中,则评估为 true .

iter : ('T &rarr; unit) &rarr; Set<'T>   &rarr; unit

根据比较函数按顺序将给定函数应用于集合的每个元素.

map : ('T &rarr; 'U) &rarr; Set<'T>   &rarr; Set<'U>

返回一个新集合,其中包含将给定函数应用于输入集的每个元素的结果.

maxElement : Set<'T> &rarr; 'T

根据用于集合的顺序返回集合中的最高元素.

minElement : Set<'T> &rarr; 'T

根据用于集合的顺序返回集合中的最低元素.

ofArray : 'T array &rarr; Set<'T>

创建一个包含与给定数组相同元素的集合.

ofList : 'T list &rarr; Set<'T>

创建一个包含与给定列表相同元素的集合.

ofSeq : seq<'T> &rarr; Set<'T>

从给定的可枚举对象创建一个新集合.

partition : ('T &rarr; bool) &rarr;   Set<'T> &rarr; Set<'T> * Set<'T>

将集合拆分为两个集合,其中包含给定谓词分别返回truefalse的元素.

remove : 'T &rarr; Set<'T> &rarr;   Set<'T>

返回删除了给定元素的新集合.如果集合不包含给定元素,则不会引发异常.

singleton : 'T &rarr; Set<'T>

包含给定元素的集合.

toArray : Set<'T> &rarr; 'T array

按顺序创建一个包含集合元素的数组.

toList : Set<'T> &rarr; 'T list

按顺序创建一个包含集合元素的列表.

toSeq : Set<'T> &rarr; seq<'T>

以可枚举对象的形式返回集合的有序视图.

union : Set<'T> &rarr; Set<'T>   &rarr; Set<'T>

计算两组的并集.

unionMany : seq<Set<'T>> &rarr;   Set<'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