执行以下代码时出现错误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
的行中。它必须是试图在减少的同时减少的东西。
答案 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")
之类的内容测试您的代码会引发您遇到的错误。