Clojure返回seq中所有以第一个元素为键的对的列表

Mic*_*icM 2 clojure seq

我需要定义一个名为(get-all-pairs key seq)的函数

它返回seq中所有以第一个元素为键的对的列表.如果没有对匹配,则返回空列表.

例如,如果我说宠物

(def pets
   '((cat 1) (dog 1) (fish 1) (cat 2) (fish 2))
)
Run Code Online (Sandbox Code Playgroud)

(get-all-pairs 'cat pets)返回((cat 1) (cat 2))(get-all-pairs 'bird pets)返回'().

这是我的尝试:

(defn get-all-pairs [key seq]
  (cond
    (= key (first(first(seq)))) (cons (first seq) 
                                      (get-all-pairs key (rest seq)))
    :else '()))
Run Code Online (Sandbox Code Playgroud)

但它不起作用.如果我打电话给它,它的消息如下:

#'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)
Run Code Online (Sandbox Code Playgroud)

我不知道问题出在哪里.怎么解决?

ama*_*loy 6

直接错误是因为你的定义中有太多的parens:(first (first (seq)))应该只是(first (first seq)).一旦你修复了它,你的函数应该运行完成,但给你错误的答案:想想()你的else情况是否真的是你想要的.

一旦你完成了手动递归方法,试着弄清楚这个解决方案中发生了什么:

(defn get-all-pairs [k pairs]
  (filter #(= k (first %)) pairs))
Run Code Online (Sandbox Code Playgroud)