Есть ли разница между итерируемым и перечислимым?

16

Многие языки, кажется, имеют очень похожие структуры, называемые итеративными или перечислимыми. Это структуры, которые можно повторять или перечислять, что мне кажется очень похожим. Являются ли эти слова синонимичными или есть тонкое семантическое различие между итерируемым и перечислимым, которое оправдывает выбор термина?

AlexC
источник
1
Сам человек, Джон Скит, в своей книге сокрушается, что C # пошел с Enumerable вместо Iterable. Это решение привело к такой путанице.
RubberDuck

Ответы:

13

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

Если вы имеете в виду два слова как английские глаголы, а не как ключевые слова языка программирования, то

  • итерация означает «цикл по всем элементам набора, один за другим»
  • перечисление означает «дать каждому элементу набора порядковый номер, один за другим»

И поскольку для перечисления необходима итерация, а для перечисления подразумевается какая-то итерация, эти два описания процесса обычно можно взаимозаменять.

Док Браун
источник
3
+1 почему вы упоминаете перечисления хотя? Перечисление как структура будет ортогональным к перечисляемости? Хотя я думаю, вы могли бы сказать, что природа перечисления будет «давать каждой константе в наборе порядковый номер, один за другим» ... :)
Marjan Venema
@MarjanVenema: хорошо, ключевое слово "enum" происходит от enum - думаю, я думаю?
Док Браун
О, я бы так сказал. Я получил свою курицу и яйцо неправильно :-)
Марьян Венема
3
@DocBrown - enum сокращенно для перечисления.
Ли
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"
user1022209
источник
-1

перечисление считается, итерация - это повтор

второе перечисление даст то же число, итерация может быть вариацией

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

user108306
источник