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" 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 。
计数:设置<'T> → int 返回集合中元素的数量。
差异:设置<'T>→设置<'T>→设置<'T> 返回一个新集合,其中第二个集合的元素已从第一个集合中删除。
空:设置<'T> 指定类型的空集。
存在:('T → bool) → Set<'T> → bool 测试集合中的任何元素是否满足给定的谓词。如果输入函数是谓词并且元素是 i0...iN,则此函数计算谓词 i0 或 ... 或谓词 iN。
过滤器:('T → bool) → Set<'T> → Set<'T> 返回一个新集合,仅包含给定谓词返回true的集合元素。
折叠 : ('状态→'T→'状态)→'状态→设置<'T>→'状态 将给定的累积函数应用于集合的所有元素。
FoldBack : ('T → '状态 → '状态) → 设置<'T> → '状态 → '状态 将给定的累积函数应用于集合的所有元素。
forall : ('T → bool) → Set<'T> → bool 测试集合的所有元素是否满足给定的谓词。如果输入函数为 p 并且元素为 i0...iN,则该函数计算 p i0 && ... && p iN。
相交:集合<'T>→集合<'T>→集合<'T> 计算两个集合的交集。
intersectMany : seq<Set<'T>> → Set<'T> 计算集合序列的交集。该序列必须非空。
isEmpty : 设置<'T> → bool 如果集合为空,则返回true 。
isProperSubset : Set<'T> → Set<'T> → bool 如果第一个集合的所有元素都在第二个集合中,并且第二个集合中的至少一个元素不在第一个集合中,则求值为true
isProperSuperset : Set<'T> → Set<'T> → bool 如果第二个集合的所有元素都在第一个集合中,并且第一个集合中的至少一个元素不在第二个集合中,则求值为true
isSubset : Set<'T> → Set<'T> → bool 如果第一个集合的所有元素都在第二个集合中,则求值为true 。
isSuperset : Set<'T> → Set<'T> → bool 如果第二组的所有元素都在第一组中,则求值为true 。
iter : ('T → 单位) → Set<'T> → 单位 根据比较函数按顺序将给定函数应用于集合的每个元素。
地图:('T → 'U) → 设置<'T> → 设置<'U> 返回一个新集合,其中包含将给定函数应用于输入集的每个元素的结果。
maxElement : 设置<'T> → 'T 根据集合使用的顺序返回集合中的最高元素。
minElement : 设置<'T> → 'T 根据集合使用的顺序返回集合中的最低元素。
ofArray : 'T 数组 → Set<'T> 创建一个包含与给定数组相同元素的集合。
ofList : 'T 列表 → 设置 <'T> 创建一个包含与给定列表相同元素的集合。
ofSeq : seq<'T> → Set<'T> 从给定的可枚举对象创建一个新集合。
分区 : ('T → bool) → Set<'T> → Set<'T> * Set<'T> 将集合拆分为两个集合,其中包含给定谓词分别返回 true 和 false 的元素。
删除:'T→设置<'T>→设置<'T> 返回删除了给定元素的新集合。如果集合不包含给定元素,则不会引发异常。
单例:'T → Set<'T> 包含给定元素的集合。
toArray : 设置<'T> → 'T 数组 创建一个按顺序包含集合元素的数组。
toList : 设置<'T> → 'T 列表 创建一个列表,其中按顺序包含该集合的元素。
toSeq : 设置<'T> → seq<'T> 以可枚举对象的形式返回集合的有序视图。
联合:集合<'T>→集合<'T>→集合<'T> 计算两个集合的并集。
unionMany : seq<Set<'T>> → 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