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