我需要定义一个函数,它接受一个序列和一些作用于序列内元素的函数。它从旧序列返回一个序列,其中删除了具有重复函数值的元素。
(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))))))))