我有以下数据。
(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))