clojure - ArityException 传递给 : core/max 的参数数量 (0) 错误

标签 clojure

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

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

但是,如果我运行这段代码

(apply max (filter #(zero? (mod % 7)) (range 1 10)))

然后我得到结果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))))
<小时/>

应用并减少

因为问题出现了,这里简单解释一下apply和reduce之间的区别。

它们是两个完全不同的概念,但是,在以下情况下,与 max 结合使用时,它们会执行相同的工作。

xs 为任何数字集合。

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

申请

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

但是,应用可以让某人调用以集合形式传递参数的函数。因此,对应于最后一个示例,以下是可能的: (apply max [3]),或 (apply max [5 9]),或 (apply max [4 1 3]) ... 只是 (apply max [] ) 甚至 (apply max) 都会导致与上面相同的数量异常。这在很多情况下都很有用。

减少

减少对比度有点棘手。与映射和过滤器一样,它对于像 Clojure 这样的函数式编程语言来说是绝对必要的。

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

假设,有人想要找出集合中所有数字的总和。 令 xs[3 4 5 23 9 4]

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

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

(+ 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

(还有一种方法可以指定备忘录的起始值,请参阅 clojuredocs.org 了解更多详细信息)

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

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

(max 4 1) ; memo is 4
(max 4 3) ; memo is 4
(max 4 5) ; memo is 5
(max 5 2) ; memo is 5

所以?

现在使用哪一个?结果表明,(reduce max (range 100000000))(apply max (range 100000000)) 所花费的时间并没有显着差异。无论如何,应用解决方案对我来说看起来更容易,但这只是我的意见。

关于clojure - ArityException 传递给 : core/max 的参数数量 (0) 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34982530/

相关文章:

java - Clojure - 找不到匹配的方法

clojure - 查询函数在 om.next 中返回值为 nil

clojure - Clojure 有彩色 REPL 吗?

Clojure — 部分在 `->` 宏中

clojure - 如何让 Lein 与 JFreeChart 和 Dejcartes 配合使用?

java - 我如何查看与 Clojure 中的对象关联的方法?

clojure - 如何将导入添加到 "eval"ed 的 clojure 代码中?

clojure - 如何在 clojure 中实例化 Stream.Builder 类? (使用java 9)

java - Clojure Intellij Cursive插件JDK错误

clojure - 与 Clojure 的序列不一致?