在尝试减少和减少时,在clojure中出现IllegalArgumentException

时间:2012-10-24 22:01:15

标签: clojure

执行以下代码时出现错误IllegalArgumentException Don't know how to create ISeq from: java.lang.Long clojure.lang.RT.seqFrom (RT.java:487)

(defn phrase-length [phr]
    (loop [n 0 b () s ()]
      (if (= n (count phr))
        (concat #(reduce + b) #(reduce + s))
        (recur (inc n)
               (cons (nth (nth (nth phr n) 1) 0) b)
               (cons (nth (nth (nth phr n) 1) 1) s)))))

错误发生在concat的行中。它必须是试图在减少的同时减少的东西。

2 个答案:

答案 0 :(得分:1)

您正在尝试连结#(reduce + b)#(reduce + s)。这不起作用,#(reduce + b)扩展为(fn* [] (clojure.core/reduce clojure.core/+ your-namespace/b))。你不能连接功能。也许你的意思是(reduce + b),但这没有任何意义,因为结果是一个数字,你也不能连接数字。也许你的意思 [(reduce + b) (reduce + s)](map + b s)(+ (reduce + b) (reduce + s)),但在不知道您实际想要实现的目标的情况下,我不能盲目猜测。

这些行:

           (cons (nth (nth (nth phr n) 1) 0) b)
           (cons (nth (nth (nth phr n) 1) 1) s)

也很奇怪。 phr是seqs of seqs of ses的seq?

你的这个形式的集合是[[[0 0 ,,,] [0 1 ,,,] ,,,] ,,,](你在这里是0到b和1到s)?如果是这样,你应该编写用于访问这些值的函数,因为找出正在发生的事情是一件苦差事。

答案 1 :(得分:0)

nth返回一个值。

执行(cons (nth (nth (nth phr n) 1) 0) b)后,在评估(nth phr n)后,您将在值中应用下一个nth,而不是在Seq。

使用(phrase-length "123")之类的内容测试您的代码会引发您遇到的错误。