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
Clojure ArityException传递给的参数(0)数目错误:core/max_Clojure - Fatal编程技术网

Clojure ArityException传递给的参数(0)数目错误:core/max

Clojure ArityException传递给的参数(0)数目错误:core/max,clojure,Clojure,如果我运行此代码,我将得到一个错误“ArityException错误的参数数(0)传递给:core/max” 但是,如果我运行此代码 (apply max (filter #(zero? (mod % 7)) (range 1 10))) 然后我得到结果7 有人能帮我解决这个问题吗?根据错误消息,传递给max的参数数为0,这是错误的。我想这是有道理的,因为不可能计算一个空列表的最大值 max没有参数的原因是在1和3之间没有可被7整除的数字 (filter #(zero? (mod % 7))

如果我运行此代码,我将得到一个错误“ArityException错误的参数数(0)传递给:core/max”

但是,如果我运行此代码

(apply max (filter #(zero? (mod % 7)) (range 1 10)))
然后我得到结果7


有人能帮我解决这个问题吗?

根据错误消息,传递给
max
的参数数为0,这是错误的。我想这是有道理的,因为不可能计算一个空列表的最大值

max没有参数的原因是在1和3之间没有可被7整除的数字

(filter #(zero? (mod % 7)) (range 1 3))
这将生成一个空序列

但是,必须使用至少一个参数调用max。当您将空序列应用于它时,将使用零参数调用它,这将产生arity异常

你可以这样做:

(defn my [a b]
  (let [result (filter #(zero? (mod % 7)) (range a b))]
    (if (zero? (count result))
        nil ; or 0 or.. whatever
        (apply max result))))
(max 4 1) ; memo is 4
(max 4 3) ; memo is 4
(max 4 5) ; memo is 5
(max 5 2) ; memo is 5

应用和减少

因为问题来了,这里有一个简短的解释应用和减少之间的区别

然而,它们是两个完全不同的概念,在下面的例子中,当与max结合使用时,它们的作用是相同的

xs
成为任何数字的集合

(应用最大xs)
等于
(减少最大xs)

应用

通常函数是用许多参数调用的,因此可以像这样调用max:(max 3)、or(max 5 9)、or(max 4 1 3)。。。如前所述:just(max)将是一个arity异常

然而,Apply允许有人调用以集合形式传递参数的函数。因此,与最后一个示例相对应,以下是可能的:(应用max[3]),或(应用max[59]),或(应用max[413])。。。仅(apply max[])或甚至(apply max)将导致与上述相同的算术异常。这在许多情况下都很有用

减少

对比度的减少有点棘手。除了map和filter之外,它对于Clojure这样的函数式编程语言是绝对必要的

reduce的主要思想是遍历一个集合,在每个步骤中,处理当前项的所需信息并将其添加到备忘录或累加器中

比如说,一个人想要找出集合中所有数字的总和。 让
xs
成为
[3 4 5 23 9 4]

(reduce+xs)
可以完成这项工作

可以更明确地写:
(reduce(fn[memo value](+memo value))xs)
作为第一个reduce参数传递的函数需要两个参数:第一个是memo,第二个是集合中当前项的值。现在为集合中的每个项调用该函数。函数的返回值保存为备注。
注意:集合的第一个值用作备忘录的初始值,因此迭代从集合的第二个值开始。下面是它正在做的事情:

(+ 3 4)    ; memo is 7 now
(+ 7 5)    ; memo is 12 now
(+ 12 23)  ; memo is 35 now
(+ 35 9)   ; memo is 44 now
(+ 44 4)   ; memo is 48 now
(还有一种方法可以指定备忘录的起始值,有关详细信息,请参阅)

这与max相同。在每次迭代中,将当前项的值与备忘录进行比较。每次将最高值保存到备忘录:因此,本例中的备忘录表示“到目前为止的最大值”

因此
(reduce max[4 1 3 5 2])
的计算如下:

(defn my [a b]
  (let [result (filter #(zero? (mod % 7)) (range a b))]
    (if (zero? (count result))
        nil ; or 0 or.. whatever
        (apply max result))))
(max 4 1) ; memo is 4
(max 4 3) ; memo is 4
(max 4 5) ; memo is 5
(max 5 2) ; memo is 5
那么呢?


现在用哪一个?它表明,在
(减少最大值(范围100000000))
(应用最大值(范围100000000))
所用的时间上没有显著差异。无论如何,应用解决方案看起来更容易,但这只是我的观点。

在1和3之间没有可被7整除的数字,第一个示例中的筛选结果返回一个空序列,这意味着如果调用
(apply max[])
,则第一个示例将返回一个空序列,这与调用
(max)
相同。至少需要一个参数,因此是
ArityException

修复此问题的两个选项:

(last (filter #(zero? (mod % 7)) (range 1 3))


非常感谢你,安东!你知道“应用”和“减少”有什么不同吗。因为我在运行代码(apply max result)和(reduce max result)时得到了相同的结果。非常感谢。