【问题标题】:Function not returning (Clojure)函数不返回(Clojure)
【发布时间】:2018-08-10 12:04:34
【问题描述】:

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

(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 的第二个分支:如果年龄小于或等于 18,它只返回 nil 。您需要返回累加器(new-map):(if ... (conj ...) new-map)

标签: clojure clojure-core.logic


【解决方案1】:

The problem is with your if expression - there is no else clause, so it is returning nil when the voter is aged less than 18.

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)

【讨论】:

    【解决方案2】:

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

    filter

    clojure.core/filter ([pred] [pred coll])

    返回 coll 中项的惰性序列 (pred item) 返回逻辑真。 pred 必须没有副作用。 当没有提供集合时返回一个转换器。


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

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

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

    【讨论】:

      猜你喜欢
      • 2020-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-25
      • 2011-07-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多