Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure返回seq中第一个元素为key的所有对的列表_Clojure_Seq - Fatal编程技术网

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

Clojure返回seq中第一个元素为key的所有对的列表,clojure,seq,Clojure,Seq,我需要定义一个名为 (按顺序获取所有对) 它返回seq中第一个元素为key的所有对的列表。如果没有匹配的对,则返回空列表 例如,如果我定义宠物 (def pets '((cat 1) (dog 1) (fish 1) (cat 2) (fish 2)) ) (获取所有对的猫宠物)返回((第1类)(第2类)),和(获取所有对的鸟宠物)返回”() 以下是我的尝试: (defn get-all-pairs [key seq] (cond (= key (first(first(se

我需要定义一个名为 (按顺序获取所有对)

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

例如,如果我定义宠物

(def pets
   '((cat 1) (dog 1) (fish 1) (cat 2) (fish 2))
)
(获取所有对的猫宠物)
返回
((第1类)(第2类))
,和
(获取所有对的鸟宠物)
返回
”()

以下是我的尝试:

(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(first)(seq))
应该是
(first(first seq))
。一旦你解决了这个问题,你的函数应该一直运行到完成,但是给出了错误的答案:想想
()
是否真的是你在
的情况下想要的

完成手动递归方法后,请尝试了解此解决方案中的情况:

(defn get-all-pairs [k pairs]
  (filter #(= k (first %)) pairs))

你在正确的轨道上,但有点想得太多了。允许您抽象出许多您试图手动执行的操作。在这种情况下,我们可以生成一个seq并迭代使用if表达式:when

(defn get-all-pairs [animal L]
  (for [k L
        :when (= animal (first k))]
    k))

非常感谢你!读了你的评论后,我意识到我的:else案例是错误的。但我现在遇到了一个新问题。如果我尝试:(cond(=key(first(first-seq))(cons(first-seq))(get-all-pairs-key(rest-seq))(not=key(first(first-seq)))(get-all-pairs-key(rest-seq)):else'(),结果是一条堆栈溢出错误消息。我怎样才能完成这个递归方法呢?如果你仔细观察,你会发现你实际上根本没有一个基本情况:要么第一个键等于
键,在这种情况下你会重复,要么不是,在这种情况下你仍然会重复;您有一个
:else
子句,但它仅在
x
既不等于
键,也不等于它(即,从不)时运行。