函数不返回(Clojure)



我是 clojure 的新手,我的函数 elligble 选民没有返回向量,我哪里出错了。

(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)

问题出在您的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)

虽然reduce如果能够做你想做的事情,但使用更适合过滤集合的东西。

filter

Clojure.core/filter ([前置] [前置](

返回 coll 中项的延迟序列,其中 (预报项(返回逻辑真。Pred必须没有副作用。 未提供集合时返回传感器。


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

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

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

相关内容

  • 没有找到相关文章

最新更新