为什么+(或*)与 - (或/)零参数的行为不同?

时间:2015-10-09 10:09:23

标签: clojure

使用零参数调用 +

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)

3 个答案:

答案 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)

所以这正是你所期望的。

+

的类似作品

那为什么它不适用于-/? 我会说他们不是聚合函数,传统上它们与聚合相反。在数学中,有+(Σ)和*(Π)的运算符,-/没有运算符

再一次,这只是猜测。也许有一些原因更深刻。