Apakah ada perbedaan antara iterable dan enumerable?

16

Banyak bahasa tampaknya memiliki struktur yang sangat mirip yang disebut iterable atau enumerable. Ini adalah struktur yang dapat diulang atau dicacah, yang bagi saya tampak sangat mirip. Apakah kata-kata ini bersinonim atau ada perbedaan semantik yang halus antara iterable dan enumerable yang membenarkan pilihan istilah?

AlexC
sumber
1
Pria itu sendiri, Jon Skeet, menyesalkan dalam bukunya bahwa C # pergi dengan Enumerable bukan Iterable. Keputusan itu telah menyebabkan banyak kebingungan semacam ini.
RubberDuck

Jawaban:

13

IMHO ini tergantung pada konteksnya, kadang-kadang mereka sama, kadang tidak. Misalnya, dalam C # Anda memiliki tipe data "IEnumerable", yang mengklasifikasikan iterator, tetapi Anda juga memiliki deklarasi "enum" yang untuk konstanta simbolik, bukan khusus untuk iterasi. Dalam bahasa pemrograman lain (atau konteks lain) situasinya mungkin serupa atau tidak.

Jika Anda memaksudkan dua kata itu hanya sebagai kata kerja bahasa Inggris dan tidak secara khusus sebagai kata kunci bahasa pemrograman, maka

  • iterating berarti "mengulang semua elemen dari set, satu demi satu"
  • penghitungan berarti untuk "memberikan setiap elemen dari satu set angka urut, satu per satu"

Dan karena iterasi diperlukan untuk enumerasi, dan enumerasi menyiratkan semacam iterasi, kedua deskripsi proses tersebut biasanya dapat dipertukarkan.

Doc Brown
sumber
3
+1 mengapa Anda menyebutkan enum? Enum sebagai suatu struktur akan menjadi ortoghonal menuju enumarabilitas? Meskipun saya kira Anda bisa mengatakan bahwa sifat dari enum akan "memberikan masing-masing konstan dalam satu set jumlah ordinal, satu per satu" ... :)
Marjan Venema
@ Marsjanen: well, kata kunci "enum" berasal dari enum - erate, saya kira?
Doc Brown
Doh, ya, saya akan bilang begitu. Saya mendapatkan ayam dan telur saya dengan cara yang salah :-)
Marjan Venema
3
@DocBrown - enum adalah kependekan dari enumerasi.
Lee
3
@ Lee: itu pertanyaan retoris ;-)
Doc Brown
4

Seperti yang dikatakan orang lain, semantik tepatnya tergantung pada bahasa pemrograman yang menggunakan istilah, jadi saya akan memberikan penilaian linguistik murni.

"Iterable" adalah kata yang agak baru diciptakan, jelas merujuk pada "iterasi" dan "iterator" yang telah dibangun banyak bahasa. Oleh karena itu, jenis-jenis seperti itu hampir pasti mendukung iterator, tetapi belum tentu apa pun yang lain, dan belum tentu apa pun di luar fungsi iterator paling dasar: memproses setiap item satu kali. Membalikkan, menghapus, mengukur jarak, dll. Mungkin didukung atau tidak.

"Enumerable" mengacu pada menghitung hal-hal, yang dapat berarti sama dengan iterasi, tetapi hanya jika bahasa tersebut belum menggunakan "iterable" untuk tujuan itu. Jika suatu bahasa memiliki keduanya, "enumerable" hampir pasti berarti sesuatu yang lain, mungkin sesuatu yang lebih kuat. Kemungkinan besar, itu akan mendukung gagasan menghubungkan setiap elemen dengan indeks numerik yang unik, dan mungkin itu akan memungkinkan akses acak (misalnya mengambil elemen ketiga sebelum yang pertama dan kedua).

Itu tentang semua makna yang dapat Anda simpulkan hanya dari kata-kata. Dalam situasi konkret apa pun, merujuk ke dokumentasi API perpustakaan standar.

Kilian Foth
sumber
1

Saya ingin fokus pada definisi ketat kedua istilah tersebut

Iterable adalah untuk mengulangi hal-hal, dan mendapatkan akses ke elemen satu per satu.

Saya pikir istilah Enumerableitu berasal dari mesin pemutar. Ini tentang kemampuan untuk membuat daftar elemen satu per satu dalam urutan yang tepat. Hal-hal yang dapat dicantumkan satu per satu harus countable, masing-masing memiliki indeks korespondensi yang unik. Diberikan elemen, Anda bisa mendapatkan indeks unik. Diberikan indeks, Anda hanya dapat menemukan satu elemen yang mungkin terkait dengan indeks itu.

Dengan kata lain, Enumerablemenyiratkan kemampuan untuk menghasilkan elemen. Beberapa bahasa pemrograman, misalnya, Haskelltelah menerapkan gagasan ini. Ada kelas tipe Enum , dan Charsalah satunya adalah instance.

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

Prelude> fromEnum 'a'
97
Prelude> enumFromTo 'a' (toEnum 122 :: Char)
"abcdefghijklmnopqrstuvwxyz"
pengguna1022209
sumber
-1

enumerasi sedang menghitung, iterasi adalah replaying

enumerasi kedua akan menghasilkan angka yang sama, iterasi dapat berupa variasi

fraktal dibangun oleh iterasi dari suatu fungsi, mengulangi fungsi pada hasil iterasi terakhir, setiap iterasi memiliki nilai yang berbeda

pengguna108306
sumber