为什么这个函数返回nil?是因为D.S是懒惰的吗?

时间:2009-10-06 19:36:36

标签: clojure

(defn get-doc-list [a-term]
     (map #(Integer/parseInt %)(take-nth 3 (take (* 3 3)(rest (rest a-term))))))

此函数适用于小型列表,但在较大的列表上返回空序列。有什么问题?

2 个答案:

答案 0 :(得分:1)

这肯定是一个输入问题,因为你的函数最多会解析3个整数:

user=> (get-doc-list (repeat "1"))
(1 1 1)

如果提供的字符串少于3个,则只返回空序列:

user=> (get-doc-list ["1" "1"])
()

如果给出非字符串,则抛出异常:

user=> (get-doc-list [1 1 1])
java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String

我建议检查输入“失败”的确是......也许你传递的内容类似[[“1”“1”“1”...]]

user=> (get-doc-list [["1" "1" "1"]])
()

这是向量的向量,因为您可以看到没有处理任何内容,因此没有错误或序列要生成。

答案 1 :(得分:0)

问题是您使用take函数,它只返回集合的前n项。无论您传递的集合有多大get-doc-list,只有前9个集合会传递给take-nth