在clojure中按关键字过滤返回ClassCastException错误

时间:2017-12-13 23:02:18

标签: filter clojure classcastexception

我将我的表定义为

(def persons '({:id 1 :name "olle"} {:id 2 :name "anna"} {:id 3 :name "isak"} {:id 4 :name "beatrice"}))

然后尝试使用filter命令,(< :id 2)是我的函数,而persons是我正在过滤的参数。

(filter (< :id 2) persons); 

我正在返回此错误,并且不知道如何修复我的程序

ClassCastException clojure.lang.Keyword cannot be cast to java.lang.Number  clojure.lang.Numbers.lt (Numbers.java:221)

1 个答案:

答案 0 :(得分:2)

问题是filter的第一个参数应该是谓词函数,但在您的示例中,它只是(< :id 2)

(filter #(< (:id %) 2) persons)

该函数应该接受一个参数(当前元素)并返回一个值,该值指示它是否满足谓词。对于同样的事情,这也是有效的,更长的语法:

(filter (fn [p] (< (:id p) 2)) persons)

您还可以defn这样的独立谓词函数:

(defn id-less-than-2? [person]
  (< (:id person) 2))
(filter id-less-than-2? persons)