函数不返回(Clojure)

时间:2018-08-10 12:04:34

标签: clojure clojure-core.logic

我是Clojure的新手,我的职能不明朗的选民没有返回向量,这是我错了。

(def human-db
  [
   {:name "Kanishk" :age 28 :sex "male"}
   {:name "Kanishk1" :age 29 :sex "male"}
   {:name "Kanishk2" :age 0 :sex "female"}
   {:name "Kanishk3" :age 1 :sex "male"}
   {:name "Kanishk4" :age 3 :sex "female"}
   {:name "Kanishk5" :age 3 :sex "male"}
   {:name "Kanishk6" :age 3 :sex "female"}
   {:name "Kanishk7" :age 3 :sex "male"}
   {:name "Kanishk8" :age 3 :sex "female"}])


(defn elligble-voters
  [human-db]
  (reduce (fn
            [new-map map]
            (if (> (:age map) 18)
              (conj new-map map)))  [] human-db))
(elligble-voters human-db)

2 个答案:

答案 0 :(得分:2)

问题出在您的if表达式上-没有else子句,因此当选民的年龄小于18岁时,它将返回nil。

human-db中的最后一项年龄为3岁,因此if返回nil,因此减少了返回nil

这有效:

(defn elligble-voters [human-db]
  (reduce (fn [new-map map]
            (if (> (:age map) 18)
              (conj new-map map)
              new-map)) ;; <-- Added `new-map` here
          []
          human-db))

更简洁的表达相同功能的方法如下:

(filter (fn [{:keys [age]}] (> age 18)) human-db)

答案 1 :(得分:0)

reduce期间,如果有能力做您想做的事,请使用更适合过滤集合的内容。

filter

  

clojure.core /过滤器   ([pred] [pred coll])

     

返回coll中项目的惰性序列,为此     (pred项目)返回逻辑true。 pred必须没有副作用。     如果没有提供任何采集,则返回一个换能器。


(defn elligble-voters [human-db]
  (filter #(> (:age %) 18) human-db))

#(> (:age %) 18)是匿名函数的简写,等效于

(fn [x] 
  (> (:age x) 18))