これは、Haskell とクイックソートに関する他の質問と密接に関連しています。少なくとも、 Haskell に関する本の紹介を読む必要があると思います。既存の変数の値を変更することを禁止するという重要なポイントをまだ把握していないようです。
スワップ (C++ で理解され、使用されている) は、その性質上、既存の値を変更することがすべてです。これは、名前を使用してコンテナーを参照し、そのコンテナーを完全に異なるコンテンツに置き換え、その操作を特定のコンテナーに対して高速 (かつ例外なし) に特化して、変更して公開するアプローチを実装できるようにするためです。 (例外セーフなコードを書いたり、ロックフリーのコードを書こうとする場合に重要です)。
Haskell でジェネリック スワップを記述できますが、おそらく値のペアを取り、位置を逆にした同じ値を含む新しいペアを返すか、またはそのようなものです。実際には同じものではなく、同じ用途もありません。Haskell ではそのようなことを行うことは許可されていないため、そのマップの内部を掘り下げて個々のメンバー変数を交換することにより、マップに特化しようとしても意味がありません (特殊化はできますが、そうではありません)。変数の変更)。
Haskell でリストを「測定」したいとします。
measure :: [a] -> Integer
それが型宣言です。これは、関数measure
がすべてのリストを取り (a
は小文字で始まるため、ジェネリック型パラメーターです)、Integer を返すことを意味します。したがって、これは任意の要素型のリストに対して機能します。これは、C++ では関数テンプレート、または Haskell では多態性関数と呼ばれるものです (C++ の多態性クラスとは異なります)。
興味深いケースごとに特殊化を提供することで、それを定義できるようになりました。
measure [] = 0
つまり、空のリストを測定するとゼロになります。
他のすべてのケースをカバーする非常に一般的な定義を次に示します。
measure (h:r) = 1 + measure r
LHS の括弧内のビットはパターンです。それは次のことを意味します:リストを取り、頭を壊してそれを h と呼び、残りの部分を r と呼びます。これらの名前は、使用できるパラメーターです。これは、少なくとも 1 つのアイテムを含むすべてのリストに一致します。
C++ でテンプレート メタプログラミングを試したことがある場合、まったく同じスタイル (ループを実行するための再帰、再帰を終了させるための特殊化) が含まれているため、これはすべて古い帽子です。Haskell では実行時に機能することを除いて (特定の値または値のパターンに対する関数の特殊化)。