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

标签 clojure seq

我需要定义一个函数 (获取所有对 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/

相关文章:

function - Clojure中的除数函数

list - Seq 的使用与 List、Array 和 Vector 的使用相比如何?

scala - 我可以使用 for-yield 语法返回 Scala 中的 Map 集合吗?

java - 在图形代码中处理除以零

clojure - 如何将自己的文件加载到lein repl中?

r - 无法在 R 中正确生成按季度的日期序列

bash - 如何在 bash 中创建嵌套序列?

bash - seq 同时使用逗号和点作为小数分隔符

在 for 循环中重置 Clojure 输出绑定(bind)

clojure - 如何以编程方式生成记录定义?