Clojure:返回整个项,而不是其中的一个析构函数值,使用一些



我有以下数据。

(def food-journal
  [{:month 1 :day 1 :human 5.3 :critter 2.3}
   {:month 1 :day 2 :human 5.1 :critter 2.0}
   {:month 2 :day 1 :human 4.9 :critter 2.1}
   {:month 2 :day 2 :human 5.0 :critter 2.5}
   {:month 3 :day 1 :human 4.2 :critter 3.3}
   {:month 3 :day 2 :human 4.0 :critter 3.8}
   {:month 4 :day 1 :human 3.7 :critter 3.9}
   {:month 4 :day 2 :human 3.7 :critter 3.6}])

我不明白为什么下面的代码只返回一行(这就是我想要的),

(some #(and (> (:critter %) 3) %) food-journal)

而下面的代码(我相信与上面完全相同)返回一个数字。

(some (fn [{c :critter}] (and (> c 3) c)) food-journal)

问题:我在使用匿名函数fn的代码中做错了什么?它为什么要回一行?如何使它在保留fn的同时返回一行结果。

some的返回值是对第一个返回真实值的项运行给定函数的结果。因为这是函数的结果,所以返回的值可能与输入不同,正如您在这里看到的那样。


在的情况下

(some #(and (> (:critter %) 3) %) food-journal)

您的%是指整个地图。


在的情况下

(some (fn [{c :critter}] (and (> c 3) c)) food-journal)

您正在破坏映射,并将c仅绑定到critter值,而不是绑定到整个映射。因此,当您返回c时,您只得到整数值。


将其与进行比较

(some (fn [{c :critter :as critter-map}]
         (and (> c 3) critter-map))
 food-journal)

它在决定返回任何东西时只比较c(已销毁数),但在决定返回某些东西时,返回整个critter-map


或者,与其使用some,不如考虑使用filter来获得延迟序列,first只获取第一个元素——与some不同,filter返回过滤器返回truthy值的项目,而不是返回的truthy:

(->> food-journal
  (filter (fn [{c :critter}] (> c 3)))
  (first))

最新更新