使用零参数调用 + 时
user=> (+)
0
我 0 ,因为它是 + 的不变元素。它与 *
类似user=> (*)
1
为什么这不适用于 - 和 / ?
user=> (-)
ArityException Wrong number of args (0) passed to: core/- clojure.lang.AFn.throwArity (AFn.java:429)
user=> (/)
ArityException Wrong number of args (0) passed to: core// clojure.lang.AFn.throwArity (AFn.java:429)
答案 0 :(得分:2)
技术解释如下:
如果您选中MATCH (me:User {username:"matt"})
OPTIONAL MATCH (me)-[:Owner]->(msg:Message)<-[likes:Likes]-(user:User)
WHERE likes.created_on > x-days-ago
WITH me, msg, user, likes.created_on as created_on
ORDER BY created_on LIMIT 25
WITH me, collect(distinct {user:user, created_on:created_on}) as activities
OPTIONAL MATCH (me)<-[mentions:Mentions]-(msg:Message)-[:Owner]->(user:User)
WITH me, msg, user, mentions.created_on as created_on, activities
ORDER BY created_on LIMIT 25
WITH me, activities + collect(distinct {user:user, created_on:created_on}) as activities
OPTIONAL MATCH (me)<-[follows:Follows]-(user:User)
WITH me, msg, user, follows.created_on as created_on, activities
ORDER BY created_on LIMIT 25
UNWIND (activities + collect(distinct {user:user, created_on:created_on})) as activity
RETURN activity
ORDER BY activity.created_on LIMIT 25
,(source *)
和(source +)
您会看到(source -)
和*
可以使用0个参数,而+
函数则不会。
-
答案 1 :(得分:2)
请注意myApp.controller('myPopoverController', function ($scope) {
ons.createPopover('myPopover.html').then(function (popover) {
$scope.popover = popover;
});
});
和-
在给出单个参数时的工作方式不同:/
与(- x 0)
不同。 (- x)
和(/ x 1)
也是如此。 (/ x)
和+
的实际论点是,当您的参数可能事先未知时,您只能在列表上*
或apply
(可能为空)。分裂和否定也是如此,因为你很少需要:
reduce
你至少有一个论点:
(apply / list)
这不是权威的,只是猜测。
答案 2 :(得分:2)
我想这种行为的原因是使用+
和*
聚合函数:这允许在数学公式中转义大量的样板代码。请注意以下事项:
(reduce + ()) => 0
(reduce * ()) => 1
选择的值不会影响同质函数的整体结果。假设您必须找到10,20的产品以及某些集合中的所有项目。这就是你做的:
(defn product [items]
(* 10 20 (reduce * items)))
所以当你在coll中有一些项目时,它将完全可以预测:
(product [1 2 3]) => (* 10 20 (* 1 2 3))
当coll为空时,您将获得以下内容:
(product []) => (* 10 20 1)
所以这正是你所期望的。
+
那为什么它不适用于-
和/
?
我会说他们不是聚合函数,传统上它们与聚合相反。在数学中,有+
(Σ)和*
(Π)的运算符,-
和/
没有运算符
再一次,这只是猜测。也许有一些原因更深刻。