Existe uma diferença entre iterável e enumerável?

16

Muitas línguas parecem ter estruturas muito semelhantes chamadas iteráveis ​​ou enumeráveis. São estruturas que podem ser iteradas ou enumeradas, que me parecem coisas extremamente semelhantes. Essas palavras são sinônimos ou existe uma diferença semântica sutil entre iterável e enumerável que justifica a escolha do termo?

AlexC
fonte
1
O próprio homem, Jon Skeet, lamenta em seu livro que o C # foi com Enumerable em vez de Iterable. Essa decisão levou a muito desse tipo de confusão.
precisa

Respostas:

13

IMHO isso depende do contexto, às vezes eles são sinônimos, às vezes não são. Por exemplo, em C # você tem um tipo de dados "IEnumerable", que classifica iteradores, mas também possui a declaração "enum", que é para constantes simbólicas, não especificamente para iterações. Em outras linguagens de programação (ou outros contextos), a situação pode ser semelhante ou não.

Se você quer dizer as duas palavras como verbos em inglês e não especificamente como palavras-chave da linguagem de programação,

  • iteração significa "percorrer todos os elementos de um conjunto, um por um"
  • enumerar significa "atribuir a cada elemento de um conjunto um número ordinal, um por um"

E como a iteração é necessária para enumerar, e enumerar implica algum tipo de iteração, essas duas descrições de processo geralmente podem ser trocadas.

Doc Brown
fonte
3
+1 por que você menciona enums? O enum como estrutura seria ortogonal à enumarabilidade? Embora eu acho que você poderia dizer que a natureza de uma enumeração seria "dando a cada constante em um conjunto de um número ordinal, um por um" ... :)
Marjan Venema
@MarjanVenema: bem, a palavra-chave "enum" vem de enum erate, eu acho?
Doc Brown
Ah, sim, eu diria. Eu tenho a minha galinha e do ovo do lado errado :-)
Marjan Venema
3
@DocBrown - enum é a abreviação de enumeração.
Lee
3
@Lee: que era uma pergunta retórica ;-)
Doc Brown
4

Como outros já disseram, a semântica precisa depende da linguagem de programação que usa os termos, então darei uma avaliação puramente linguística.

"Iterável" é uma palavra bastante nova, obviamente se referindo a "iteração" e aos "iteradores" que muitas linguagens construíram. Portanto, esses tipos quase certamente suportam um iterador, mas não necessariamente qualquer outra coisa, e não necessariamente algo além a funcionalidade mais básica do iterador: processando cada item uma vez. Reversão, exclusão, medição de distâncias etc. podem ou não ser suportadas.

"Enumerável" refere-se a enumerar coisas, o que pode significar o mesmo que iterar, mas apenas se o idioma ainda não usar "iterável" para esse fim. Se uma linguagem possui ambos, "enumerável" quase certamente significa outra coisa, provavelmente algo mais poderoso. Provavelmente, ele suportará a noção de conectar cada elemento com um índice numérico único e provavelmente permitirá acesso aleatório (por exemplo, recuperação do terceiro elemento antes do primeiro e do segundo).

É sobre todo o significado que você pode deduzir razoavelmente apenas das palavras. Em qualquer situação concreta, consulte os documentos da API da biblioteca padrão.

Kilian Foth
fonte
1

Quero me concentrar na definição estrita de ambos os termos

Iterable é iterar as coisas e obter acesso ao elemento, um por um.

Eu acho que o termo Enumerablefoi originado da máquina de tornear. É sobre a capacidade de listar o elemento um por um em uma ordem adequada. As coisas podem ser listadas uma a uma countable, cada uma com um índice de correspondência exclusivo. Dado um elemento, você pode obter um índice exclusivo. Dado um índice, você pode encontrar apenas um elemento possível associado a esse índice.

Em outras palavras, Enumerableimplica a capacidade de gerar os elementos. Alguma linguagem de programação, por exemplo, Haskellimplementou essa ideia. Existe uma classe do tipo Enum e Charé uma da instância.

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
fonte
-1

enumeração está contando, iteração é uma repetição

uma segunda enumeração produzirá o mesmo número, uma iteração pode ser uma variação

fractais são construídos por iterações de uma função, repetindo a função no resultado da última iteração, cada iteração tem um valor diferente

user108306
fonte