我需要定义一个函数 (获取所有对 key 序列)
它返回 seq 中以 key 作为第一个元素的所有对的列表。如果没有匹配对,则返回空列表。
例如,如果我定义宠物
(def pets
'((cat 1) (dog 1) (fish 1) (cat 2) (fish 2))
)
(get-all-pairs 'cat pets)
返回 ((cat 1) (cat 2))
和 (get-all-pairs '鸟宠物)
返回 '()
。
这是我的尝试:
(defn get-all-pairs [key seq]
(cond
(= key (first(first(seq)))) (cons (first seq)
(get-all-pairs key (rest seq)))
:else '()))
但是它不起作用。如果我调用它,它会发出如下消息:
#'proj2.proj2/pets
=> (get-all-pairs 'cat pets)
ClassCastException clojure.lang.PersistentList cannot be cast to clojure.lang.IFn proj2.proj2/get-all-pairs (proj2.clj:20)
不知道问题出在哪里。如何解决?
最佳答案
立即出现的错误是因为您的定义中有太多括号:(first (first (seq)))
应该是 (first (first seq))
。一旦你解决了这个问题,你的函数应该运行完成,但给你错误的答案:想想 ()
是否真的是你在 else
情况下想要的。 p>
一旦您制定了手动递归方法,请尝试弄清楚此解决方案中发生了什么:
(defn get-all-pairs [k pairs]
(filter #(= k (first %)) pairs))
关于Clojure 返回 seq 中以 key 作为第一个元素的所有对的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22265582/