web-dev-qa-db-ja.com

反復可能と列挙可能の違いはありますか?

多くの言語は、反復可能または列挙可能と呼ばれる非常に類似した構造を持っているようです。これらは反復または列挙できる構造であり、私には非常によく似ています。これらの単語は同義語ですか、それとも用語の選択を正当化する反復可能と列挙可能の間にわずかな意味上の違いがありますか?

16
AlexC

私見これは文脈に依存しますが、同義語である場合とそうでない場合があります。たとえば、C#では、反復子を分類する「IEnumerable」というデータ型がありますが、特に反復ではなく記号定数用の「列挙型」宣言もあります。他のプログラミング言語(または他のコンテキスト)では、状況は似ている場合とそうでない場合があります。

プログラミング言語のキーワードとしてではなく、英語の動詞として2つの単語を意味する場合、

  • 反復とは、「セットのすべての要素を1つずつループする」ことを意味します
  • 列挙は、「セットの各要素に序数を1つずつ与える」ことを意味します

また、列挙には反復が必要であり、列挙はある種の反復を意味するため、これら2つのプロセスの説明は通常交換できます。

14
Doc Brown

他の人が言ったように、正確なセマンティクスは用語を使用するプログラミング言語に依存するため、純粋に言語的な評価を行います。

「反復可能」はかなり新しい造語の単語であり、明らかに「反復」と多くの言語に組み込まれている「反復子」を指します。したがって、そのような型はほぼ確実に反復子をサポートしますが、必ずしも他のものはサポートせず、必ずしもそれ以上のものはサポートしません最も基本的なイテレータ機能:すべてのアイテムを1回処理します。距離の逆転、削除、測定などはサポートされている場合とサポートされていない場合があります。

「列挙可能」とは、列挙することを指します。これはcanが反復と同じことを意味しますが、言語がその目的で「反復可能」をまだ使用していない場合のみです。言語に両方がある場合、「列挙可能」はほぼ確実に別の何か、おそらくより強力な何かを意味します。おそらく、各要素を一意の数値インデックスで接続するという概念をサポートし、おそらくランダムアクセスを許可します(たとえば、最初と2番目の要素の前に3番目の要素を取得します)。

それは、言葉だけから合理的に推測できるすべての意味です。具体的な状況については、標準ライブラリAPIドキュメントを参照してください。

4
Kilian Foth

両方の用語の厳密な定義に焦点を当てたい

Iterableは物事を反復し、要素に1つずつアクセスするためのものです。

Enumerableという用語は旋盤に由来すると思います。要素を適切な順序で1つずつリストする機能です。 1つずつリストすることができるものはcountableである必要があり、それぞれに一意の対応インデックスがあります。要素を指定すると、一意のインデックスを取得できます。インデックスを指定すると、そのインデックスに関連付けられた1つの可能な要素のみを見つけることができます。

つまり、Enumerableは要素を生成する機能を意味します。一部のプログラミング言語、たとえばHaskellはこのアイデアを実装しています。 Enum タイプのクラスがあり、Charがインスタンスの1つです。

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
user1022209