¿Hay alguna diferencia entre iterable y enumerable?

16

Muchos lenguajes parecen tener estructuras muy similares llamadas iterables o enumerables. Estas son estructuras que se pueden repetir o enumerar, que me parecen cosas extremadamente similares. ¿Son estas palabras sinónimos o hay una sutil diferencia semántica entre iterable y enumerable que justifique la elección del término?

AlexC
fuente
1
El hombre mismo, Jon Skeet, lamenta en su libro que C # fue con Enumerable en lugar de Iterable. Esa decisión ha llevado a mucho de este tipo de confusión.
RubberDuck

Respuestas:

13

En mi humilde opinión, esto depende del contexto, a veces son sinónimos, a veces no lo son. Por ejemplo, en C # tiene un tipo de datos "IEnumerable", que clasifica los iteradores, pero también tiene la declaración "enum" que es para constantes simbólicas, no específicamente para iteraciones. En otros lenguajes de programación (u otros contextos) la situación puede ser similar o no.

Si quiere decir las dos palabras como verbos en inglés y no específicamente como palabras clave del lenguaje de programación, entonces

  • iterar significa "recorrer todos los elementos de un conjunto, uno por uno"
  • enumerar significa "dar a cada elemento de un conjunto un número ordinal, uno por uno"

Y dado que la iteración es necesaria para enumerar, y la enumeración implica algún tipo de iteración, esas dos descripciones de proceso generalmente se pueden intercambiar.

Doc Brown
fuente
3
+1 ¿por qué mencionas enumeraciones? ¿La enumeración como estructura sería ortogonal a la enumeración? Aunque supongo que se podría decir que la naturaleza de una enumeración sería "dar a cada constante en un conjunto un número ordinal, uno por uno" ... :)
Marjan Venema
@MarjanVenema: bueno, supongo que la palabra clave "enum" proviene de enum - erate.
Doc Brown
Oh, sí, yo diría que sí. Conseguí mi pollo y huevo al revés :-)
Marjan Venema
3
@DocBrown - enum es la abreviatura de enumeración.
Lee
3
@Lee: esa fue una pregunta retórica ;-)
Doc Brown
4

Como han dicho otros, la semántica precisa depende del lenguaje de programación que usa los términos, por lo que daré una evaluación puramente lingüística.

"Iterable" es una palabra bastante nueva, que obviamente se refiere a "iterar" y a los "iteradores" que muchos lenguajes han incorporado. Por lo tanto, estos tipos casi seguramente admiten un iterador, pero no necesariamente cualquier otra cosa, y no necesariamente nada más allá de La funcionalidad de iterador más básica: procesar cada elemento una vez. Invertir, eliminar, medir distancias, etc. puede o no ser compatible.

"Enumerable" se refiere a enumerar cosas, que pueden significar lo mismo que iterar, pero solo si el lenguaje ya no usa "iterable" para ese propósito. Si un idioma tiene ambos, "enumerable" casi seguramente significa algo más, probablemente algo más poderoso. Lo más probable es que admitirá la noción de conectar cada elemento con un índice numérico único, y probablemente permitirá el acceso aleatorio (por ejemplo, recuperar el tercer elemento antes que el primero y el segundo).

Eso es todo el significado que puede inferir razonablemente de solo las palabras. En cualquier situación concreta, consulte los documentos API de la biblioteca estándar.

Kilian Foth
fuente
1

Quiero centrarme en la definición estricta de ambos términos

Iterable es iterar cosas y obtener acceso al elemento uno por uno.

Creo que el término Enumerablese originó en la máquina de torneado. Se trata de la capacidad de enumerar el elemento uno por uno en un orden adecuado. Las cosas se pueden enumerar una por una tiene que sercountable , cada una tiene un índice de correspondencia único. Dado un elemento, puede obtener un índice único. Dado un índice, solo puede encontrar un elemento posible asociado con ese índice.

En otras palabras, Enumerableimplica la capacidad de generar los elementos. Algún lenguaje de programación, por ejemplo, Haskellha implementado esta idea. Hay una clase de tipo Enum , y Chares una de las instancias.

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

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

la enumeración es contar, la iteración es una repetición

una segunda enumeración producirá el mismo número, una iteración puede ser una variación

los fractales se construyen mediante iteraciones de una función, repitiendo la función en el resultado de la última iteración, cada iteración tiene un valor diferente

usuario108306
fuente