错误的args(0)传递给:循环/重复函数上的PersistentVector

use*_*455 4 clojure

尝试定义一个factors函数,该函数将使用loop/recur返回数字的所有因子的向量.

;; `prime?` borrowed from https://swizec.com/blog/comparing-clojure-and-node-js-for-speed/swizec/1593

(defn prime? [n]
  (if (even? n) false
      (let [root (num (int (Math/sqrt n)))]
        (loop [i 3] (if (> i root) true
                        (if (zero? (mod n i)) false
                            (recur (+ i 2))))))))

(defn factors [x] (
  (loop [n x i 2 acc []]
    (if (prime? n) (conj acc n)
        (if (zero? (mod n i)) (recur (/ n i) 2 (conj acc i))
            (recur n (inc i) acc))))))
Run Code Online (Sandbox Code Playgroud)

但是我一直遇到以下错误:

ArityException Wrong number of args (0) passed to: PersistentVector clojure.lang.AFn.throwArity

我必须在这里遗漏一些明显的东西.任何建议都非常感谢!

ama*_*loy 10

让我在你的代码中移动空格,这样你就会明白错误:

(defn factors [x] 
  ((loop [n x i 2 acc []]
     (if (prime? n) (conj acc n)
         (if (zero? (mod n i)) (recur (/ n i) 2 (conj acc i))
             (recur n (inc i) acc))))))
Run Code Online (Sandbox Code Playgroud)

((在功能开始时看到的很奇怪吗?那是什么意思?请记住,在Clojure中,与通常的lisps一样,括号不是分组构造!它们是一个函数调用机制,你不能只是为了好玩而抛出额外的东西.在这里,您所写的内容具有以下含义:

  1. 运行这loop将计算向量.
  2. 将结果值作为函数调用,不传递任何参数.