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→Set <' T>→Set <'T> セットに要素が追加された新しいセットを返します。セットに指定された要素がすでに含まれている場合、例外は発生しません。
含む: 'T→Set <' T>→bool に評価します true 指定された要素が指定されたセットにある場合。
カウント:Set <'T>→int セット内の要素の数を返します。
違い:Set <'T>→Set <' T>→Set <'T> 2番目のセットの要素が最初のセットから削除された新しいセットを返します。
空:Set <'T> 指定されたタイプの空のセット。
存在する:( 'T→bool)→Set <' T>→bool コレクションのいずれかの要素が指定された述語を満たすかどうかをテストします。入力関数が述語であり、要素がi0 ... iNの場合、この関数は述語i0または...または述語iNを計算します。
フィルタ:( 'T→bool)→Set <' T>→Set <'T> 指定された述語が返すコレクションの要素のみを含む新しいコレクションを返します true
fold :( 'State→' T→ 'State)→' State→Set <'T>→' State 指定された累積関数をセットのすべての要素に適用します。
foldBack :( 'T→'状態→ '状態)→Set <' T>→ '状態→'状態 指定された累積関数をセットのすべての要素に適用します。
forall :( 'T→bool)→Set <' T>→bool コレクションのすべての要素が指定された述語を満たしているかどうかをテストします。入力関数がpで、要素がi0 ... iNの場合、この関数はp i0 && ... && piNを計算します。
交差:Set <'T>→Set <' T>→Set <'T> 2つのセットの共通部分を計算します。
crossMany:seq <Set <'T >>→Set <' T> セットのシーケンスの共通部分を計算します。シーケンスは空でない必要があります。
isEmpty:Set <'T>→bool 戻り値 true セットが空の場合。
isProperSubset:Set <'T>→Set <' T>→bool に評価します true 最初のセットのすべての要素が2番目のセットにあり、2番目のセットの少なくとも1つの要素が最初のセットにない場合。
isProperSuperset:Set <'T>→Set <' T>→bool に評価します true 2番目のセットのすべての要素が最初のセットにあり、最初のセットの少なくとも1つの要素が2番目のセットにない場合。
isSubset:Set <'T>→Set <' T>→bool に評価します true 最初のセットのすべての要素が2番目のセットにある場合。
isSuperset:Set <'T>→Set <' T>→bool に評価します true 2番目のセットのすべての要素が最初のセットにある場合。
iter :( 'T→unit)→Set <' T>→unit 比較関数に従って、指定された関数をセットの各要素に適用します。
マップ:( 'T→' U)→Set <'T>→Set <' U> 指定された関数を入力セットの各要素に適用した結果を含む新しいコレクションを返します。
maxElement:Set <'T>→' T セットに使用されている順序に従って、セットの最上位の要素を返します。
minElement:Set <'T>→' T セットに使用されている順序に従って、セットの最下位の要素を返します。
ofArray: 'T配列→Set <' T> 指定された配列と同じ要素を含むセットを作成します。
ofList: 'Tリスト→Set <' T> 指定されたリストと同じ要素を含むセットを作成します。
ofSeq:seq <'T>→Set <' T> 指定された列挙可能なオブジェクトから新しいコレクションを作成します。
パーティション:( 'T→bool)→Set <' T>→Set <'T> * Set <' T> セットを、指定された述語がそれぞれtrueとfalseを返す要素を含む2つのセットに分割します。
削除: 'T→Set <' T>→Set <'T> 指定された要素が削除された新しいセットを返します。セットに指定された要素が含まれていない場合、例外は発生しません。
シングルトン: 'T→Set <' T> 指定された要素を含むセット。
toArray:Set <'T>→' T配列 セットの要素を順番に含む配列を作成します。
toList:Set <'T>→' Tリスト セットの要素を順番に含むリストを作成します。
toSeq:Set <'T>→seq <' T> コレクションの順序付けられたビューを列挙可能なオブジェクトとして返します。
和集合:Set <'T>→Set <' T>→Set <'T> 2つのセットの和集合を計算します。
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