web-dev-qa-db-ja.com

従来のインターフェースとしてシーケンスが推奨されるのはなぜですか?

バークレー版のsicpの参照から text 、次のように述べられています:

プログラムをシーケンス操作として表現すると、プログラムの設計に役立ちますモジュール式。つまり、私たちのデザインは、それぞれがシーケンスを変換する比較的独立した部分を組み合わせることによって構築されます。一般に、コンポーネントを柔軟な方法で接続するための従来のインターフェイスとともに標準コンポーネントのライブラリを提供することにより、モジュラー設計を促進できます。

たとえば、Pythonでは、<class 'list'>および<class 'Tuple'>は、ストレージに主に使用されるシーケンシャルデータモデルのタイプの一部です。

たとえば、In python <class 'dict'>は、非シーケンシャルデータモデルの一般的なタイプの1つです。

テキストリファレンスは、2つの異なる問題に対するpythonで書かれた解決策を以下に示し、これら2つの問題はこの決定を行うための代表的なサンプルではないため、説得力のない同様の解決策として言及しています。

>>> def sum_even_fibs(n):
        """Sum the even members of the first n Fibonacci numbers."""
        return sum(filter(iseven, map(fib, range(1, n+1))))
>>> sum_even_fibs(20)
3382

>>> def acronym(name):
        """Return a Tuple of the letters that form the acronym for name."""
        return Tuple(map(first, filter(iscap, name.split())))
>>> acronym('University of California Berkeley Undergraduate Graphics Group')
('U', 'C', 'B', 'U', 'G', 'G')

これらの例にもかかわらず、「従来のインターフェースとしてのシーケンス」を作成する決定についてはまだはっきりしていません。

それで、ライブラリまたはコンポーネントを設計する中で、なぜシーケンシャルタイプのデータモデルを従来のインターフェイスとして選択することが推奨されるのですか?これは、これらのシーケンシャルデータモデルのクロージャープロパティ(python/schema /によって提供される)と関係がありますか?舌足らずの発音)?

注:同じ推奨事項がMIT pressからのSICPテキストに記載されています

3
overexchange

ディクショナリの目的は、指定されたキーを指定して値を返すことであり、シーケンシャルコンテナとして機能することではありません。他のデータ構造がシーケンシャルであるが辞書がシーケンシャルではないからといって、シーケンスの利点が無効になるわけではありません。

シーケンスは、コンピューティングにおける3つの基本的な論理構造の1つです。すべての(解決可能な)コンピューティングの問題は、シーケンス、ループ、および決定の3つのツールで解決できます。

シーケンスは要素間の関係を保持します。つまり、最初の要素は2番目の要素の前に発生する必要があり、2番目の要素は3番目の要素の前に発生する必要があります。つまり、シーケンス内の次の要素を取得でき、他の要素と比較して正しい順序で要素を取得したことが保証されます。これには明らかに便利な利点があります。単語は、読み取られるたびに常に同じ文字のシーケンスで構成され、メソッドは、呼び出されるたびに同じ順序の命令で構成されます。

シーケンスを作成できますlazy。ステートマシンを実装し、メソッドが呼び出されるたびにステートマシンから要素を返すクラスを作成できます。シーケンスをキャッシュできます。

シーケンスは、リンクリスト、ツリー、およびその他のデータ構造から作成できます。各データ構造には固有の性質があります。単一リンクリストは、一方向に効率的にトラバースできますが、他の方向にはトラバースできません。バイナリツリーなどの一部のデータ構造では、シーケンシャルアクセスと効率的なランダムアクセスが提供されます。二重リンクリストなどの一部のデータ構造では、シーケンスを効率的に逆方向にトラバースできます。

シーケンシャルインターフェイスに準拠するようにデータ構造を作成する場合は、シーケンスの実装を、特定の要件に最も適したデータ構造に切り替えることができます。次に、そのインターフェイスに対してコードを記述し、基礎となる実装がモジュラーであることを確認できます。

Pythonのシーケンスについてはよくわかりませんが、Schemeの基本的なデータ構造(元のSICPで使用)はlist、であり、そのようなリストを作成する方法(基本的にはシーケンス)、およびそれがもたらす柔軟性とパワーは明らかです。シーケンスを含むすべての言語で、このような構成が可能です。

7
Robert Harvey