ほとんどの関数型言語は、最も基本的なリストタイプとして、一重リンクリスト(「コン」リスト)を使用していることに気付きました。例には、Common Lisp、Haskell、およびF#が含まれます。これは、ネイティブリストタイプが配列であるメインストリーム言語とは異なります。
何故ですか?
Common Lisp(動的に型指定される)の場合、短所はリスト、ツリーなどのベースにもなるほど十分に一般的であるという考えがあります。これは小さな理由かもしれません。
ただし、静的に型付けされた言語の場合、正当な理由を見つけることができず、反論さえ見つけることができます。
- 機能的なスタイルは不変性を促進するため、リンクリストの挿入の容易さはあまり利点ではありませんが、
- 機能的なスタイルは不変性を促進し、データ共有も促進します。配列はリンクリストよりも「部分的に」共有しやすいため、
- 同様に、通常の配列でパターンマッチングを行うこともできますし、さらに優れています(たとえば、右から左に簡単に折りたたむことができます)。
- さらに、ランダムアクセスが無料で得られます。
- そして(実用的な利点)言語が静的に型付けされている場合、通常のメモリレイアウトを使用して、キャッシュの速度を上げることができます。
では、なぜリンクリストを好むのでしょうか?
an array is easier to share "partially" than a linked list
あなたが何を意味するのかを明確にする必要があると思います。私は理解しているように、その再帰的な性質のため、反対は真実です-配列は新しいコピーを作成するのに時間を費やす必要がありますが、その中のノードを渡すことで簡単にリンクリストを部分的に共有できます または、データ共有の観点から、2つのリンクリストは同じサフィックスを指すことができますが、配列では単純なことはできません。