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 → Set <' T> → Set <'T> ส่งคืนชุดใหม่ที่มีองค์ประกอบที่เพิ่มเข้ามาในชุด จะไม่มีการเพิ่มข้อยกเว้นหากชุดนั้นมีองค์ประกอบที่กำหนดอยู่แล้ว
ประกอบด้วย: 'T → Set <' T> → bool ประเมินเป็น true หากองค์ประกอบที่กำหนดอยู่ในชุดที่กำหนด
นับ: ตั้งค่า <'T> → int ส่งคืนจำนวนองค์ประกอบในชุด
ความแตกต่าง: ตั้งค่า <'T> →ตั้ง <' T> →ตั้งค่า <'T> ส่งคืนชุดใหม่โดยนำองค์ประกอบของชุดที่สองออกจากชุดแรก
ว่างเปล่า: ตั้งค่า <'T> ชุดว่างสำหรับชนิดที่ระบุ
มีอยู่: ('T → bool) →ตั้งค่า <' T> → bool ทดสอบว่าองค์ประกอบใดของคอลเล็กชันตรงตามเพรดิเคตที่กำหนด หากฟังก์ชันอินพุตเป็นเพรดิเคตและอิลิเมนต์คือ i0 ... iN ฟังก์ชันนี้จะคำนวณเพรดิเคต i0 หรือ ... หรือเพรดิเคต iN
ฟิลเตอร์: ('T → bool) → Set <' T> → Set <'T> ส่งคืนคอลเล็กชันใหม่ที่มีเฉพาะองค์ประกอบของคอลเล็กชันที่เพรดิเคตที่ระบุส่งคืน true.
พับ: ('State →' T → 'State) →' State → Set <'T> →' State ใช้ฟังก์ชันการสะสมที่กำหนดกับองค์ประกอบทั้งหมดของเซต
foldBack: ('T →' State → 'State) →ตั้งค่า <' T> → 'State →' State ใช้ฟังก์ชันการสะสมที่กำหนดกับองค์ประกอบทั้งหมดของเซต
สำหรับ: ('T →บูล) →ตั้งค่า <' T> →บูล ทดสอบว่าองค์ประกอบทั้งหมดของคอลเล็กชันตรงตามเพรดิเคตที่กำหนดหรือไม่ ถ้าฟังก์ชันอินพุตคือ p และองค์ประกอบคือ i0 ... iN ฟังก์ชันนี้จะคำนวณ p i0 && ... && p iN
ตัดกัน: ตั้งค่า <'T> →ตั้ง <' T> →ตั้งค่า <'T> คำนวณจุดตัดของทั้งสองชุด
intersectMany: seq <Set <'T >> → Set <' T> คำนวณการตัดกันของลำดับชุด ลำดับต้องไม่ว่างเปล่า
isEmpty: ตั้งค่า <'T> → bool ผลตอบแทน true หากชุดว่างเปล่า
isProperSubset: ตั้งค่า <'T> →ตั้งค่า <' T> →บูล ประเมินเป็น true หากองค์ประกอบทั้งหมดของชุดแรกอยู่ในชุดที่สองและอย่างน้อยหนึ่งองค์ประกอบของชุดที่สองไม่ได้อยู่ในชุดแรก
isProperSuperset: ตั้งค่า <'T> →ตั้งค่า <' T> →บูล ประเมินเป็น true หากองค์ประกอบทั้งหมดของชุดที่สองอยู่ในชุดแรกและอย่างน้อยหนึ่งองค์ประกอบของชุดแรกไม่ได้อยู่ในชุดที่สอง
isSubset: ตั้งค่า <'T> →ตั้งค่า <' T> →บูล ประเมินเป็น true หากองค์ประกอบทั้งหมดของชุดแรกอยู่ในชุดที่สอง
isSuperset: ตั้งค่า <'T> →ตั้งค่า <' T> →บูล ประเมินเป็น true หากองค์ประกอบทั้งหมดของชุดที่สองอยู่ในชุดแรก
iter: ('T →หน่วย) →ตั้งค่า <' T> →หน่วย ใช้ฟังก์ชันที่กำหนดให้กับแต่ละองค์ประกอบของชุดโดยเรียงตามฟังก์ชันการเปรียบเทียบ
แผนที่: ('T →' U) → Set <'T> → Set <' U> ส่งคืนคอลเล็กชันใหม่ที่มีผลลัพธ์ของการใช้ฟังก์ชันที่กำหนดกับแต่ละองค์ประกอบของชุดอินพุต
maxElement: ตั้งค่า <'T> →' T ส่งคืนองค์ประกอบสูงสุดในชุดตามลำดับที่ใช้สำหรับชุด
minElement: ตั้งค่า <'T> →' T ส่งคืนองค์ประกอบต่ำสุดในชุดตามลำดับที่ใช้สำหรับชุด
ofArray: 'T array →ตั้งค่า <' T> สร้างชุดที่มีองค์ประกอบเดียวกันกับอาร์เรย์ที่กำหนด
ofList: รายการ T →ตั้งค่า <'T> สร้างชุดที่มีองค์ประกอบเดียวกันกับรายการที่กำหนด
ofSeq: seq <'T> →ตั้งค่า <' T> สร้างคอลเลกชันใหม่จากวัตถุที่ระบุได้
พาร์ติชัน: ('T → bool) → Set <' T> → Set <'T> * Set <' T> แยกชุดออกเป็นสองชุดที่มีองค์ประกอบซึ่งเพรดิเคตที่ระบุส่งกลับค่าจริงและเท็จตามลำดับ
ลบ: 'T → Set <' T> → Set <'T> ส่งคืนชุดใหม่โดยนำองค์ประกอบที่ระบุออก จะไม่มีการเพิ่มข้อยกเว้นหากชุดนั้นไม่มีองค์ประกอบที่กำหนด
ซิงเกิลตัน: 'T → Set <' T> ชุดที่มีองค์ประกอบที่กำหนด
toArray: ตั้งค่าอาร์เรย์ <'T> →' T สร้างอาร์เรย์ที่มีองค์ประกอบของชุดตามลำดับ
toList: ตั้งค่า <'T> →' T list สร้างรายการที่มีองค์ประกอบของชุดตามลำดับ
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