C'è una differenza tra iterabile ed enumerabile?


16

Molte lingue sembrano avere strutture molto simili chiamate iterabili o enumerabili. Queste sono strutture che possono essere ripetute o enumerate, che mi sembrano cose estremamente simili. Queste parole sono sinonimi o esiste una sottile differenza semantica tra iterabile ed enumerabile che giustifica la scelta del termine?


1
L'uomo stesso, Jon Skeet, lamenta nel suo libro che C # è andato con Enumerable anziché Iterable. Questa decisione ha portato a un sacco di questo tipo di confusione.
RubberDuck,

Risposte:


13

IMHO questo dipende dal contesto, a volte sono sinonimi, a volte no. Ad esempio, in C # hai un tipo di dati "IEnumerable", che classifica gli iteratori, ma hai anche la dichiarazione "enum" che è per le costanti simboliche, non specificamente per le iterazioni. In altri linguaggi di programmazione (o altri contesti) la situazione può essere simile o meno.

Se intendi le due parole proprio come verbi inglesi e non specificamente come parole chiave del linguaggio di programmazione, allora

  • iterare significa "passare in rassegna tutti gli elementi di un set, uno per uno"
  • enumerare significa "assegnare a ciascun elemento di un insieme un numero ordinale, uno per uno"

E poiché l'iterazione è necessaria per l'enumerazione e l'enumerazione implica un certo tipo di iterazione, queste due descrizioni dei processi possono in genere essere scambiate.


3
+1 perché menzioni enum però? L'enum come struttura sarebbe ortogonale all'enumarabilità? Anche se immagino che potresti dire che la natura di un enum sarebbe "dare a ogni costante in un set un numero ordinale, uno per uno" ... :)
Marjan Venema

@MarjanVenema: beh, la parola chiave "enum" deriva da enum - erate, immagino?
Doc Brown,

D'oh, direi di si. Ho fatto il mio pollo e uovo nel modo sbagliato :-)
Marjan Venema

3
@DocBrown - enum è l'abbreviazione di enumerazione.
Lee,

3
@Lee: era una domanda retorica ;-)
Doc Brown,

4

Come altri hanno già detto, la semantica precisa dipende dal linguaggio di programmazione che utilizza i termini, quindi darò una valutazione puramente linguistica.

"Iterabile" è una parola alquanto nuova, che si riferisce ovviamente a "iterazione" e agli "iteratori" in cui sono state incorporate molte lingue. Pertanto, tali tipi quasi certamente supportano un iteratore, ma non necessariamente nient'altro e non necessariamente altro la funzionalità iteratrice di base: elaborare ogni elemento una volta. Inversione, cancellazione, misurazione delle distanze ecc. Potrebbero essere supportate o meno.

"Enumerabile" si riferisce all'enumerazione delle cose, che può significare lo stesso dell'iterazione, ma solo se la lingua non utilizza già "iterabile" a tale scopo. Se una lingua ha entrambe, "enumerabile" significa quasi sicuramente qualcos'altro, probabilmente qualcosa di più potente. Molto probabilmente, supporterà l'idea di collegare ciascun elemento con un indice numerico univoco e probabilmente consentirà l'accesso casuale (ad esempio, recuperare il terzo elemento prima del primo e del secondo).

Si tratta di tutto il significato che puoi ragionevolmente dedurre solo dalle parole. In qualsiasi situazione concreta, consultare i documenti API della libreria standard.


1

Voglio concentrarmi sulla definizione rigorosa di entrambi i termini

Iterable è iterare le cose e ottenere l'accesso all'elemento uno per uno.

Penso che il termine sia Enumerablestato originato dal tornio. Si tratta della capacità di elencare l'elemento uno per uno nell'ordine corretto. Le cose possono essere elencate una per una deve essere countable, ognuna ha un indice di corrispondenza univoco. Dato un elemento, puoi ottenere un indice univoco. Dato un indice, puoi trovare solo un possibile elemento associato a quell'indice.

In altre parole, Enumerableimplica la capacità di generare gli elementi. Alcuni linguaggi di programmazione, ad esempio, Haskellhanno implementato questa idea. Esiste una classe di tipo Enum ed Charè una l'istanza.

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

l'enumerazione sta contando, l'iterazione è una riproduzione

una seconda enumerazione produrrà lo stesso numero, un'iterazione può essere una variazione

i frattali sono costruiti da iterazioni di una funzione, ripetendo la funzione sul risultato dell'ultima iterazione, ogni iterazione ha un valore diverso

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.