スキームで高階関数を使用する方法を学んでいます。高階関数を使おうと思ったのですが、うまく使いこなせません。この学習演習では、フィルター、折り畳み、および/またはマップの組み合わせのみを使用することをお勧めします。
たとえば、A と B を呼び出す 2 つのリスト間の集合の差を構築したいと考えています。x が A の要素であるが x が B の要素ではないような集合の差を x として定義しています。関数のみを使用したいマップ、フィルター、フォールド。例えば:
A = (1 8 6 2) とする
B = (5 7 9 1 6) とする
A と B のセット差は (8 2) になります。
アイデアは、A の要素を繰り返し処理し、A の要素が B の要素と等しいかどうかを確認することによって新しいリストを構築することです。等しい場合は、新しいリストに a を追加しないでください。それ以外の場合は、新しいリストに a を追加します。
私のアルゴリズムのアイデアは次のようになります。
neq を「等しくない」とする
A の a と B の b ごとに、次の式を評価します。
(neq? a b)
a = 1 の場合:
(および (neq? 1 5) (neq? 1 7) (neq? 1 9) (neq? 1 1) (neq ? 1 6))
この式が true の場合、a は新しいリストに入ります。それ以外の場合は、新しいリストに a を追加しないでください。この例
(neq? 1 1)
では false と評価されるため、新しいリストに 1 を追加しません。
私の手順全体のほとんどは 1 に依存しており、ここで問題が発生します。
- ステップ 1 を行うにはどうすればよいですか?
- ステップ 1 で
map
とfold
関数の組み合わせが必要であることがわかりましたが、どうすればand a neq b
分散型を取得できますか?
編集これは私が持っている最も近いサンプルです:
(fold-right (trace-lambda buggy (a b c) (and (neq? a b))) #t A B)
|(buggy 3 5 #t)
|#t
|(buggy 2 4 #t)
|#t
|(buggy 1 1 #t)
|#f
#f
上記は、(and (neq? ab)) チェーンを実行しようとしている匿名関数のトレースを示しています。ただし、これは A と B の同じ位置/インデックスの要素に対してのみ実行されます。
すべてのヘルプは大歓迎です!