Y a-t-il une différence entre itérable et énumérable?

16

De nombreuses langues semblent avoir des structures très similaires appelées itérables ou énumérables. Ce sont des structures qui peuvent être itérées ou énumérées, ce qui me semble des choses extrêmement similaires. Ces mots sont-ils synonymes ou existe-t-il une subtile différence sémantique entre itérable et énumérable qui justifie le choix du terme?

AlexC
la source
1
L'homme lui-même, Jon Skeet, déplore dans son livre que C # soit allé avec Enumerable au lieu d'Iterable. Cette décision a conduit à beaucoup de ce genre de confusion.
RubberDuck

Réponses:

13

À mon humble avis, cela dépend du contexte, parfois ils sont synonymes, parfois ils ne le sont pas. Par exemple, en C #, vous avez un type de données "IEnumerable", qui classe les itérateurs, mais vous avez également la déclaration "enum" qui est pour les constantes symboliques, pas spécifiquement pour les itérations. Dans d'autres langages de programmation (ou d'autres contextes), la situation peut être similaire ou non.

Si vous entendez les deux mots comme des verbes anglais et non spécifiquement comme des mots-clés de langage de programmation, alors

  • itérer signifie "boucler sur tous les éléments d'un ensemble, un par un"
  • énumérer signifie «donner à chaque élément d'un ensemble un nombre ordinal, un par un»

Et puisque l'itération est nécessaire pour l'énumération, et que l'énumération implique une sorte d'itération, ces deux descriptions de processus peuvent généralement être échangées.

Doc Brown
la source
3
+1 pourquoi mentionnez-vous des énumérations? L'énum en tant que structure serait-il orthogonal à l'énumérabilité? Bien que je suppose que vous pourriez dire que la nature d'une énumération serait de "donner à chaque constante d'un ensemble un nombre ordinal, un par un" ... :)
Marjan Venema
@MarjanVenema: eh bien, le mot-clé "énumération" vient de énumération - je suppose?
Doc Brown
Oh, ouais, je le dirais. J'ai eu mon poulet et mon œuf dans le mauvais sens :-)
Marjan Venema
3
@DocBrown - enum est l'abréviation de énumération.
Lee
3
@Lee: c'était une question rhétorique ;-)
Doc Brown
4

Comme d'autres l'ont dit, la sémantique précise dépend du langage de programmation qui utilise les termes, je vais donc donner une évaluation purement linguistique.

"Iterable" est un mot assez nouveau, faisant évidemment référence à "itération" et aux "itérateurs" que de nombreuses langues ont intégrés. Par conséquent, de tels types prennent presque certainement en charge un itérateur, mais pas nécessairement autre chose, et pas nécessairement quelque chose au-delà la fonctionnalité d'itérateur la plus élémentaire: traiter chaque élément une fois. L'inversion, la suppression, la mesure de distances, etc. peuvent ou non être prises en charge.

"Enumerable" se réfère à l'énumération des choses, ce qui peut signifier la même chose que l'itération, mais seulement si le langage n'utilise pas déjà "itérable" à cette fin. Si une langue a les deux, "énumérable" signifie presque certainement autre chose, probablement quelque chose de plus puissant. Très probablement, il soutiendra la notion de connexion de chaque élément avec un index numérique unique, et il permettra probablement un accès aléatoire (par exemple, récupérer le troisième élément avant le premier et le deuxième).

C'est à peu près tout le sens que vous pouvez raisonnablement déduire des mots. Dans toute situation concrète, reportez-vous aux documents de l'API de bibliothèque standard.

Kilian Foth
la source
1

Je veux me concentrer sur la définition stricte des deux termes

Iterable est d'itérer les choses, et d'avoir accès à l'élément un par un.

Je pense que le terme Enumerablevient de la machine à tourner. Il s'agit de la possibilité de lister l'élément un par un dans un ordre approprié. Les choses peuvent être répertoriées une par une countable, chacune a un index de correspondance unique. Étant donné un élément, vous pouvez obtenir un index unique. Étant donné un index, vous ne pouvez trouver qu'un seul élément possible associé à cet index.

En d'autres termes, Enumerableimplique la capacité de générer les éléments. Certains langages de programmation, par exemple, Haskellont mis en œuvre cette idée. Il existe une classe de type Enum et en Charest une instance.

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
la source
-1

l'énumération compte, l'itération est une relecture

une deuxième énumération donnera le même nombre, une itération peut être une variation

les fractales sont construites par itérations d'une fonction, répétant la fonction sur le résultat de la dernière itération, chaque itération a une valeur différente

user108306
la source