シーケンスを取る関数と、シーケンス内の要素に作用するいくつかの関数を定義する必要があります。重複する関数値を持つ要素が削除された古いシーケンスからシーケンスを返します。
(defn dedup [seq & functions] ...)
たとえば、
(f1 1) = 'a'
(f1 2) = 'a'
(f1 3) = 'c'
(f1 4) = 'd'
(f2 1) = 'za'
(f2 2) = 'zb'
(f2 3) = 'zc'
(f2 4) = 'zb'
それから
(dedup [1 2 3 4] f1 f2)
(1 3)のシーケンスを返します
どうすればいいのですか?
編集:誤解を生まないようにテスト値を編集しました
編集:以下は、1つの関数のみの場合の(それほど機能的ではない)実装です
(defn dedup [seq f]
(loop [values #{} seq1 seq seq2 '()]
(let [s (first seq1)]
(if (nil? s)
(reverse seq2)
(let [v (f s)]
(if (contains? values v)
(recur values (rest seq1) seq2)
(recur (conj values v) (rest seq1) (conj seq2 s))))))))