4

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. 它必须是试图减少同时也连接的东西。

4

2 回答 2

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 是 seq of seqs of seqs of longs 吗?

你的收藏是这个表格[[[0 0 ,,,] [0 1 ,,,] ,,,] ,,,]吗(你会在这里用 0 到 b 和 1 到 s)?如果是这样,您可能应该编写用于访问这些值的函数,因为找出发生了什么是一件苦差事。

于 2012-10-25T06:10:03.153 回答
0

nth返回一个值。

当你这样做(cons (nth (nth (nth phr n) 1) 0) b)时,在评估之后(nth phr n)你将nth在一个值中应用下一个,而不是在 Seq 中。

用类似的东西测试你的代码(phrase-length "123")会引发你得到的错误。

于 2012-10-24T23:16:55.393 回答