Czy istnieje różnica między iterowalnym a policzalnym?


16

Wydaje się, że wiele języków ma bardzo podobne struktury zwane iterowalnymi lub policzalnymi. Są to struktury, które można powtarzać lub wyliczać, które wydają mi się bardzo podobne. Czy te słowa są synonimami, czy też istnieje subtelna semantyczna różnica między iterowalnym a policzalnym, która uzasadnia wybór terminu?


1
Sam człowiek, Jon Skeet, lamentuje w swojej książce, że C # poszedł z Enumerable zamiast Iterable. Ta decyzja doprowadziła do wielu tego rodzaju zamieszania.
RubberDuck

Odpowiedzi:


13

IMHO zależy to od kontekstu, czasem są one synonimami, a czasem nie. Na przykład w języku C # masz typ danych „IEnumerable”, który klasyfikuje iteratory, ale masz także deklarację „enum”, która dotyczy stałych symbolicznych, a nie iteracji. W innych językach programowania (lub innych kontekstach) sytuacja może być podobna lub nie.

Jeśli masz na myśli te dwa słowa tak, jak angielskie czasowniki, a nie słowa kluczowe w języku programowania, to

  • iteracja oznacza „zapętlenie wszystkich elementów zestawu, jeden po drugim”
  • wyliczenie oznacza „nadać każdemu elementowi zestawu numer porządkowy, jeden po drugim”

A ponieważ iteracja jest potrzebna do wyliczenia, a wyliczenie implikuje pewien rodzaj iteracji, te dwa opisy procesów można zazwyczaj zamieniać.


3
+1 dlaczego wspominasz wyliczenia? Wyliczenie jako struktura byłoby ortoghonalne względem wyliczalności? Chociaż myślę, że można powiedzieć, że naturą wyliczenia byłoby „nadanie każdej stałej w zbiorze liczby porządkowej, jeden po drugim” ... :)
Marjan Venema

@MarjanVenema: cóż, słowo kluczowe „enum” pochodzi od enum - eracji, tak myślę?
Doc Brown,

Tak, powiedziałbym tak. Mam kurczaka i jajko w niewłaściwy sposób :-)
Marjan Venema

3
@DocBrown - enum jest skrótem od wyliczenia.
Lee,

3
@Lee: to było pytanie retoryczne ;-)
Doc Brown

4

Jak powiedzieli inni, dokładna semantyka zależy od języka programowania, który używa tych terminów, dlatego dokonam oceny czysto językowej.

„Iterable” to dość nowe słowo, oczywiście odnoszące się do „iteracji” i „iteratorów” wbudowanych w wiele języków. Dlatego tego typu prawie na pewno obsługują iterator, ale niekoniecznie nic innego, a niekoniecznie nic poza tym najbardziej podstawowa funkcjonalność iteratora: przetwarzanie każdego elementu raz. Cofanie, usuwanie, mierzenie odległości itp. Może być obsługiwane lub nie.

„Wyliczalny” odnosi się do wyliczania rzeczy, co może oznaczać to samo co iteracja, ale tylko wtedy, gdy język nie używa jeszcze „iterowalnego” w tym celu. Jeśli język ma jedno i drugie, „wyliczalny” prawie na pewno oznacza coś innego, prawdopodobnie coś potężniejszego. Najprawdopodobniej będzie on obsługiwał koncepcję łączenia każdego elementu unikalnym indeksem liczbowym i zapewne umożliwi losowy dostęp (np. Pobieranie trzeciego elementu przed pierwszym i drugim).

To prawie całe znaczenie, jakie można rozsądnie wywnioskować z samych słów. W każdej konkretnej sytuacji zapoznaj się ze standardowymi dokumentami API biblioteki.


1

Chcę skupić się na ścisłej definicji obu terminów

Iterable polega na iteracji i uzyskiwaniu dostępu do elementu jeden po drugim.

Myślę, że termin Enumerableten pochodzi od tokarki. Chodzi o możliwość wyszczególnienia elementu jeden po drugim w odpowiedniej kolejności. Rzeczy mogą być wymienione kolejno countable, każda z nich ma unikalny indeks korespondencji. Biorąc pod uwagę element, możesz uzyskać unikalny indeks. Biorąc pod uwagę indeks, można znaleźć tylko jeden możliwy element związany z tym indeksem.

Innymi słowy, Enumerableimplikuje zdolność do generowania elementów. Na przykład niektóre języki programowania Haskellwdrożyły ten pomysł. Istnieje klasa typu Enum i Charjest ona instancją.

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

wyliczanie się liczy, iteracja jest powtórką

drugie wyliczenie da tę samą liczbę, iteracja może być odmianą

fraktale są budowane przez iteracje funkcji, powtarzając funkcję na wyniku ostatniej iteracji, każda iteracja ma inną wartość

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.