มีความแตกต่างระหว่าง iterable และ enumerable หรือไม่?


16

หลายภาษาดูเหมือนจะมีโครงสร้างที่คล้ายกันมากเรียกว่า iterable หรือ enumerable สิ่งเหล่านี้เป็นโครงสร้างที่สามารถทำซ้ำหรือแจกแจงซึ่งดูเหมือนสิ่งที่คล้ายกันมากกับฉัน คำเหล่านี้มีความหมายเหมือนกันหรือมีความหมายแตกต่างกันเล็กน้อยระหว่าง iterable และ enumerable ซึ่งแสดงให้เห็นถึงการเลือกคำศัพท์หรือไม่?


1
Jon Skeet ชายผู้นั้นเองยังไม่วายในหนังสือของเขาที่ C # ไปกับ Enumerable แทน Iterable การตัดสินใจครั้งนี้ทำให้เกิดความสับสนอย่างมาก
RubberDuck

คำตอบ:


13

IMHO สิ่งนี้ขึ้นอยู่กับบริบทบางครั้งมีความหมายเหมือนกัน แต่บางครั้งก็ไม่เหมือนกัน ตัวอย่างเช่นใน C # คุณมีประเภทข้อมูล "IEnumerable" ซึ่งจัดประเภทตัววนซ้ำ แต่คุณยังมีการประกาศ "enum" ซึ่งเป็นค่าคงที่เชิงสัญลักษณ์ซึ่งไม่ใช่ค่าสำหรับการทำซ้ำโดยเฉพาะ ในภาษาโปรแกรมอื่น ๆ (หรือบริบทอื่น ๆ ) สถานการณ์อาจคล้ายกันหรือไม่

หากคุณหมายถึงคำสองคำเช่นเดียวกับคำกริยาภาษาอังกฤษและไม่ใช่เฉพาะเป็นคำหลักภาษาการเขียนโปรแกรมแล้ว

  • วนซ้ำหมายถึง "วนรอบองค์ประกอบทั้งหมดของชุดหนึ่งต่อหนึ่ง"
  • การแจกแจงวิธีการ "ให้แต่ละองค์ประกอบของเซตเลขลำดับทีละตัว"

และเนื่องจากการวนซ้ำเป็นสิ่งจำเป็นสำหรับการแจงนับและการแจงนับหมายถึงการทำซ้ำบางชนิดคำอธิบายกระบวนการทั้งสองจึงสามารถเปลี่ยนได้


3
+1 ทำไมคุณพูดถึง enums แม้ว่า Enum เป็นโครงสร้างจะเป็น ortoghonal ต่อการทำให้เข้าใจผิดหรือไม่? แต่ผมคิดว่าคุณสามารถพูดได้ว่าธรรมชาติของ Enum ที่จะเป็น "ให้แต่ละคงอยู่ในชุดหมายเลขลำดับหนึ่งโดยหนึ่ง" ... :)
Marjan Venema

@MarjanVenema: อืมคำหลัก "enum" มาจากenum - erate ฉันเดาเหรอ?
Doc Brown

D'oh, ya ฉันจะพูดอย่างนั้น ฉันได้ไก่และไข่มาผิดทาง :-)
Marjan Venema

3
@DocBrown - enum ย่อมาจาก enumeration
Lee

3
@Lee: นั่นเป็นคำถามเชิงโวหาร ;-)
หมอสีน้ำตาล

4

อย่างที่คนอื่นพูดความหมายที่แม่นยำนั้นขึ้นอยู่กับภาษาการเขียนโปรแกรมที่ใช้เงื่อนไขดังนั้นฉันจะให้การประเมินทางภาษาอย่างหมดจด

"Iterable" เป็นคำศัพท์ที่ค่อนข้างใหม่ซึ่งเห็นได้ชัดว่าหมายถึง "iterating" และ "iterators" ที่หลายภาษาสร้างขึ้นดังนั้นประเภทดังกล่าวเกือบจะรองรับ iterator แต่ไม่จำเป็นต้องเป็นอย่างอื่น ฟังก์ชั่น iterator พื้นฐานที่สุด: ประมวลผลทุกรายการเพียงครั้งเดียว การย้อนกลับการลบการวัดระยะทาง ฯลฯ อาจสนับสนุนหรือไม่ได้รับการสนับสนุน

"Enumerable" หมายถึงการแจกแจงสิ่งต่าง ๆ ซึ่งอาจหมายถึงการทำซ้ำ แต่ถ้าภาษานั้นไม่ได้ใช้ "iterable" เพื่อจุดประสงค์นั้น หากภาษามีทั้งสองอย่าง "นับไม่ถ้วน" เกือบจะหมายถึงอย่างอื่นอาจเป็นสิ่งที่มีประสิทธิภาพมากขึ้น ส่วนใหญ่แล้วมันจะสนับสนุนความคิดในการเชื่อมต่อแต่ละองค์ประกอบด้วยดัชนีตัวเลขที่ไม่ซ้ำกันและอาจจะอนุญาตให้เข้าถึงแบบสุ่ม (เช่นการดึงองค์ประกอบที่สามก่อนที่หนึ่งและที่สอง)

นั่นคือเกี่ยวกับความหมายทั้งหมดที่คุณสามารถอนุมานได้จากเพียงแค่คำพูด ในสถานการณ์ที่เป็นรูปธรรมใด ๆ ให้อ้างถึงเอกสาร API ของไลบรารีมาตรฐาน


1

ฉันต้องการเน้นที่คำจำกัดความที่เข้มงวดของทั้งสองคำ

Iterable คือการย้ำสิ่งต่าง ๆ และเข้าถึงองค์ประกอบทีละตัว

ฉันคิดว่าคำEnumerableนี้มาจากเครื่องกลึง มันเกี่ยวกับความสามารถในการแสดงรายการองค์ประกอบทีละรายการในลำดับที่เหมาะสม สิ่งที่สามารถแสดงรายการออกมาทีละคนจะต้องมีcountableแต่ละคนมีดัชนีการติดต่อที่ไม่ซ้ำกัน รับองค์ประกอบคุณจะได้รับดัชนีที่ไม่ซ้ำกัน รับดัชนีคุณสามารถค้นหาองค์ประกอบที่เป็นไปได้ที่เกี่ยวข้องกับดัชนีนั้นเท่านั้น

กล่าวอีกนัยหนึ่งก็Enumerableคือความสามารถในการสร้างองค์ประกอบ ตัวอย่างเช่นภาษาการเขียนโปรแกรมบางส่วนHaskellได้นำแนวคิดนี้ไปใช้ มีคลาสชนิดEnumและCharเป็นหนึ่งในอินสแตนซ์

Prelude> fromEnum True
1
Prelude> fromEnum False
0
Prelude> toEnum 1 :: Bool
True

Prelude> fromEnum 'a'
97
Prelude> enumFromTo 'a' (toEnum 122 :: Char)
"abcdefghijklmnopqrstuvwxyz"

-1

การแจงนับกำลังนับการวนซ้ำเป็นการเล่นซ้ำ

การแจงนับที่สองจะให้จำนวนเท่ากันการวนซ้ำอาจเป็นการเปลี่ยนแปลง

เศษส่วนถูกสร้างโดยการวนซ้ำของฟังก์ชันการทำซ้ำฟังก์ชันตามผลลัพธ์ของการวนซ้ำครั้งล่าสุดแต่ละรอบมีค่าที่แตกต่างกัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.