Haskell:
การใช้แอเรย์สมาชิก
วิธีการ:
Haskell ไม่มีอาร์เรย์แอสโซซีเอทีฟในตัวเช่นเดียวกับบางภาษาอื่น ๆ แต่มันมีไลบรารีมาตรฐานที่ทรงพลังชื่อ Data.Map
สำหรับการทำงานกับคู่คีย์-ค่า มาเริ่มดูวิธีการใช้งานกันเถอะ!
ก่อนอื่น ต้องมั่นใจว่าได้นำเข้ามัน:
import qualified Data.Map as Map
การสร้างแมพนั้นทำได้อย่างง่ายดาย มาสร้างหนึ่งอันที่มีภาษาโปรแกรมและพาราไดซ์ของมัน:
let languages = Map.fromList [("Haskell", "Functional"), ("Python", "Imperative"), ("Prolog", "Logical")]
ตอนนี้ ถ้าเราอยากทราบพาราไดซ์ของ Haskell?
Map.lookup "Haskell" languages
-- output: Just "Functional"
เพิ่มภาษาใหม่นั้นง่ายมาก:
let languagesUpdated = Map.insert "Rust" "Systems" languages
ถ้าเราอยากจะแสดงภาษาทั้งหมดล่ะ? ใช้ Map.keys
:
Map.keys languagesUpdated
-- output: ["Haskell","Python","Prolog","Rust"]
เพื่อแสดงพาราไดซ์ ใช้ Map.elems
:
Map.elems languagesUpdated
-- output: ["Functional","Imperative","Logical","Systems"]
การดำเนินการพื้นฐานเหล่านี้ควรจะครอบคลุมการใช้งานส่วนใหญ่ แต่ยังมีอีกมากที่จะสำรวจใน Data.Map
!
ดำดิ่งลึก
โมดูล Data.Map
ในไลบรารีมาตรฐานของ Haskell สร้างขึ้นมาจากต้นไม้ทวิภาคีที่สมดุล โดยเฉพาะ AVL trees การเลือกใช้นี้รับประกันว่าการดำเนินการส่วนใหญ่บนแมพ เช่น การใส่ เอาออก และการค้นหา สามารถทำได้ในเวลา O(log n) โดยที่ n คือจำนวนองค์ประกอบในแมพ เป็นตัวเลือกที่มีประสิทธิภาพสำหรับหลาย ๆ กรณีการใช้งาน แม้อาจจะไม่เร็วที่สุดสำหรับทุกสถานการณ์
มีเรื่องประวัติศาสตร์เล็กน้อยด้วยเช่นกัน: ก่อนที่ Data.Map
จะกลายเป็นที่นิยม Haskell โปรแกรมเมอร์มักใช้รายการของคู่เพื่อจำลองอะเรย์แอสโซซีเอทีฟ อย่างไรก็ตาม การดำเนินการบนโครงสร้างเช่นนี้มี O(n) สำหรับการค้นหา ทำให้ Data.Map
เป็นการปรับปรุงที่มีความหมายมากในแง่ของประสิทธิภาพ
ตอนนี้ แม้ว่า Data.Map
จะมีประสิทธิภาพและประโยชน์ใช้สอย มันก็ไม่ใช่เครื่องมือที่ดีที่สุดสำหรับทุกงานเสมอไป สำหรับงานที่มีความไวต่อประสิทธิภาพอย่างสูง ที่เวลาการค้นหาแม้แต่ O(log n) ยังช้าเกินไป หรือที่คีย์เป็นค่าจำนวนเต็มเสมอ อาร์เรย์หรือตารางแฮช (ผ่าน Data.HashMap
) อาจมอบประสิทธิภาพที่ดียิ่งขึ้นด้วยเวลาการเข้าถึง O(1)
ระบบนิเวศของ Haskell อนุญาตให้มีโครงสร้างข้อมูลหลายอย่างเพื่อให้เหมาะกับความต้องการต่าง ๆ และ Data.Map
เป็นตัวเลือกที่ยอดเยี่ยมสำหรับอาร์เรย์แอสโซซีเอทีฟทั่วไป ที่สมดุลระหว่างความสะดวกในการใช้งาน ความยืดหยุ่น และประสิทธิภาพ