Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何返回传递给Clojure函数的空集合的值_Clojure_Destructuring - Fatal编程技术网

如何返回传递给Clojure函数的空集合的值

如何返回传递给Clojure函数的空集合的值,clojure,destructuring,Clojure,Destructuring,我有一个函数,它从传递的映射中为某个键返回最大值。当传递的集合为空时,我想返回0。当然,我可以使用一些条件,但想知道是否有更先进的技术 (defn max-id [c] "Using as: (max-id [{ :id 1 }, { :id 2 }])" (if (empty? c) 0 (apply max (map :id c)))) ;;; (max-id []) => 0 (max-id [map-one map-two]) => 1024 具有讽

我有一个函数,它从传递的映射中为某个键返回最大值。当传递的集合为空时,我想返回
0
。当然,我可以使用一些条件,但想知道是否有更先进的技术

(defn max-id [c]
  "Using as: (max-id [{ :id 1 }, { :id 2 }])"
  (if (empty? c)
    0
    (apply max (map :id c))))
;;;
(max-id []) => 0
(max-id [map-one map-two]) => 1024
具有讽刺意味的是,“高级”是大多数高级程序员在可能的情况下往往避免的东西,通常在可能的情况下选择简单。这里的底线是,您的功能工作得很好,因为一个原因:您的意图是明确的。如果传入一个空集合,每个人都可以理解会发生什么,即使他们不是程序员。这是一个巨大的好处,并且使您的解决方案已经是一个理想的解决方案,至少就空的收集案例而言

现在,如果您可以保证一个约束,即给定集合中至少有一个
:id
s为零或更大(即,我们处理的是正
id
s),那么您可以执行以下操作:

(defn max-id [c]
  (reduce max 0 (map :id c)))
但是,如果您有一个地图列表,其中所有都有一个负id,即:
[{:id-1}{:id-2}]
,则这不起作用,因为在这种情况下,最大id应该是
-1
,因此上面的回答不正确

还有其他的解决方案,但它们涉及到条件检查,即使它有点含蓄。例如:

(defn max-id [c]
  (apply max (or (not-empty (map :id c)) [0])))
我不推荐的一个选项是用一个函数替换
max
,该函数接受0个或多个参数,检查是否有任何参数,如果有,调用
max
,如果没有,则返回
0
。除非你有一些其他的用例,要求无的
max
为零,否则我会避免这样做,所以我甚至不打算发布它。这变得过于复杂,需要读者去挖掘,所以不要这样做

另一方面,有一个核心函数不太为人所知,它可以说更惯用于在列表中查找给定键的值最大的元素。它被称为
max key

(defn max-id [c]
  (:id (apply max-key :id c)))
然而,我想说的是,如果不是因为
max key
不如
max
map
那样广为人知的原因,您的函数更容易理解。因此,在这里为您提供一个附加选项。

具有讽刺意味的是,“高级”是大多数高级程序员在可能的情况下倾向于避免的东西,通常在可能的情况下选择简单。这里的底线是,您的功能工作得很好,因为一个原因:您的意图是明确的。如果传入一个空集合,每个人都可以理解会发生什么,即使他们不是程序员。这是一个巨大的好处,并且使您的解决方案已经是一个理想的解决方案,至少就空的收集案例而言

现在,如果您可以保证一个约束,即给定集合中至少有一个
:id
s为零或更大(即,我们处理的是正
id
s),那么您可以执行以下操作:

(defn max-id [c]
  (reduce max 0 (map :id c)))
但是,如果您有一个地图列表,其中所有都有一个负id,即:
[{:id-1}{:id-2}]
,则这不起作用,因为在这种情况下,最大id应该是
-1
,因此上面的回答不正确

还有其他的解决方案,但它们涉及到条件检查,即使它有点含蓄。例如:

(defn max-id [c]
  (apply max (or (not-empty (map :id c)) [0])))
我不推荐的一个选项是用一个函数替换
max
,该函数接受0个或多个参数,检查是否有任何参数,如果有,调用
max
,如果没有,则返回
0
。除非你有一些其他的用例,要求无的
max
为零,否则我会避免这样做,所以我甚至不打算发布它。这变得过于复杂,需要读者去挖掘,所以不要这样做

另一方面,有一个核心函数不太为人所知,它可以说更惯用于在列表中查找给定键的值最大的元素。它被称为
max key

(defn max-id [c]
  (:id (apply max-key :id c)))

然而,我想说的是,如果不是因为
max key
不如
max
map
那样广为人知的原因,您的函数更容易理解。所以,在这里给你一个额外的选择。

谢谢你的解释。你说得对,我的意图很清楚。我怎么能忘记
reduce
。谢谢你的提示,对我来说非常有价值。哇,我以前从未遇到过
max key
!谢谢你的解释。你说得对,我的意图很清楚。我怎么能忘记
reduce
。谢谢你的提示,对我来说非常有价值。哇,我以前从未遇到过
max key