ほとんどの関数型言語では、リンクリストを主要な不変のデータ構造として使用しています。なぜリストではなく、木?ツリーはパスやモデルリストを再利用することもできます。
リストはツリーよりも単純だからです。 (リストは、すべてのノードに子が1つしかない縮退したツリーであるという事実によって、これを簡単に見ることができます。)
Consリストは、任意のサイズの最も単純な再帰的データ構造です。
Guy Steeleは、Fortressプログラミング言語の設計中に、将来の超並列計算では、データ構造と制御フローの両方が、現在のように線形ではなく、複数のブランチを持つツリー状である必要があると主張しました。ただし、当面の間、コアデータ構造ライブラリのほとんどは、並列処理ではなく、逐次反復処理(または末尾再帰、実際には問題ではなく、同じものです)を念頭に置いて設計されています。
たとえば、データ構造が具体的に設計されたClojureでfor今日の並列、分散、「曇り」の世界、配列(Clojureではベクターと呼ばれます)でさえ、おそらくそれらの中で最も「線形」なデータ構造です。は実際にはツリーとして実装されます。
つまり、要約すると、consリストは可能な限り最も単純な永続的再帰データ構造であり、より複雑な「デフォルト」を選択する必要はありませんでした。もちろん他のものもオプションとして利用できます。 Haskellには、配列、優先度キュー、マップ、ヒープ、treap、try、および想像できるすべてのものがありますが、デフォルトは単純なconsリストです。
実際には、それらのリストare trees! car
とcdr
の2つのフィールドを持つノードがあり、これらのノードまたはリーフをさらに含めることができます。これらのツリーをリストにする唯一のことは、線形リストの次のノードへのリンクとしてのinterpretcdr
リンクの慣習と、car
です。現在のノードの値としてリンクします。
そうは言っても、関数型プログラミングにおけるリンクリストの普及は、反復に対する再帰の普及にリンクしていると思います。手元にある唯一のループ構造が(末尾)再帰である場合、それを使いやすいデータ構造が必要です。リンクされたリストはそのために最適です。