我需要定义一个函数,它需要一个序列和一些作用于序列内部元素的函数。它从旧序列中返回一个序列,其中删除具有重复函数值的元素。在clojure中去除重复序列
(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))))))))
澄清抱歉,我的意思是说不应该重复函数的值,但两个函数可能具有相同的值。 – kakarukeys
你的问题目前还不清楚。我不知道为什么你从第一组函数中排除2但不是1。它们都与我能看到的重复(“a”)相关联。 –
排除其中任何一个都可以。 – user1442023