Чи є різниця між ітерабельним та перелічуваним?


16

Багато мов, схоже, мають структури, які дуже схожі, називаються ітерабельними або перелічуваними. Це структури, які можна переробити чи перерахувати, які мені здаються надзвичайно схожими. Ці слова є синонімами чи є тонка смислова різниця між ітерабельним та перелічувальним, що виправдовує вибір терміна?


1
Сам чоловік Джон Скіт у своїй книзі скаржиться на те, що C # пішов із «Численними» замість «Ітерабельних». Таке рішення призвело до чимало подібного замішання.
RubberDuck

Відповіді:


13

ІМХО це залежить від контексту, іноді вони є синонімами, іноді - ні. Наприклад, у C # у вас є тип даних "IEnumerable", який класифікує ітератори, але у вас є також декларація "enum", яка призначена для символічних констант, а не конкретно для ітерацій. В інших мовах програмування (або інших контекстах) ситуація може бути подібною чи ні.

Якщо ви маєте на увазі ці два слова як англійські дієслова, а не конкретно як ключові слова мови програмування, то

  • ітерація означає "перебирати петлі над усіма елементами набору, по одному"
  • перерахування означає "надати кожному елементу множини порядковий номер по одному"

Оскільки ітерація потрібна для перерахування, а перерахування означає певну ітерацію, ці два описи процесу можуть бути замінені.


3
+1 чому ви згадуєте переліків? Енум як структура був би ортогональним для перерахованості? Хоча я гадаю, ви могли б сказати, що природа перерахунку полягала б у тому, щоб "давати кожній константі в наборі порядковий номер по одному" ... :)
Мар'ян Венема

@MarjanVenema: ну, ключове слово "enum" походить від enum - erate, я думаю?
Doc Brown

Ой, так, я б сказав так. Я отримав свою курячу та яєць неправильно :-)
Marjan Venema

3
@DocBrown - перерахунок короткий для перерахування.
Лі

3
@Lee: це було риторичне питання ;-)
Док Браун

4

Як говорили інші, точна семантика залежить від мови програмування, яка використовує терміни, тому я дам суто лінгвістичну оцінку.

"Ітерабельний" - це досить нове складене слово, яке, очевидно, посилається на "повторення" та "ітератори", які вбудували багато мов. Тому такі типи майже напевно підтримують ітератор, але необов'язково що-небудь інше, і не обов'язково нічого іншого основна функціональність ітератора: обробка кожного елемента один раз. Реверсування, видалення, вимірювання відстаней тощо можуть підтримуватися або не підтримуватися.

"Перелічувальний" відноситься до перерахування речей, що може означати те саме, що повторюється, але лише якщо мова вже не використовує "ітерабельну" для цієї мети. Якщо мова має і те, і інше, "чисельний" майже напевно означає щось інше, ймовірно, щось більш потужне. Швидше за все, він буде підтримувати поняття про з'єднання кожного елемента з унікальним числовим індексом, і, ймовірно, він дозволить отримати випадковий доступ (наприклад, отримання третього елемента перед першим та другим).

Ось про все значення, яке ви розумно можете зробити з лише слів. У будь-якій конкретній ситуації зверніться до стандартних документів бібліотеки 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

перерахунок підрахунок, ітерація - це повторення

друге перерахування дасть те саме число, ітерація може бути варіацією

фрактали будуються ітераціями функції, повторюючи функцію за результатом останньої ітерації, кожна ітерація має різне значення

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.