2

为什么必须在 get-word-ids 中使用“first”,这样做的正确方法是什么?

(defn parts-of-speech []
  (lazy-seq (. POS values)))

(defn index-words [pos]
  (iterator-seq (. dict getIndexWordIterator pos)))

(defn word-ids [word]
  (lazy-seq (. word getWordIDs)))

(defn get-word [word-id]
  (. dict getWord word-id))

(defn get-index-words []
  (lazy-seq (map index-words (parts-of-speech))))

(defn get-word-ids []
  (lazy-seq (map word-ids (first (get-index-words)))))

;; this works, but why do you have to use "first" in get-word-ids?
(doseq [word-id (get-word-ids)]
  (println word-id))
4

2 回答 2

4

简短的回答:删除所有对lazy-seq.

至于您最初的问题,即使它不是惰性序列的惯用用法,也值得解释。您必须首先使用,因为 get-word-ids 函数返回一个带有一个条目的惰性序列。该条目是您正在寻找的惰性序列。

看起来像这样

( (word1 word2 word3) )

所以首先返回你想要的序列:

(word1 word2 word3)


您将使用的唯一时间很可能是lazy-seq这种模式:

(lazy-seq (cons :something (function-call :produces :the :next :element)))

我从未见过任何其他模式中使用过惰性序列。的目的lazy-seq是生成新的原始数据序列。如果存在生成数据的代码,那么使用类似的东西几乎总是更好iterate map,或者for生成你的惰性序列。

于 2012-04-20T18:08:21.017 回答
1

这似乎是错误的:

(defn get-index-words []
  (lazy-seq (map index-words (parts-of-speech))))

(index-words pos) 返回一个序列。这就是为什么你需要一个(第一个)get-word-ids。

map 也已经是惰性的,因此无需将 (map ...) 包装在惰性序列中,如果 map不是惰性的,在 map 周围使用惰性序列几乎毫无意义。如果您在 clojure 中阅读更多(惰性)序列,它可能会很有用。

于 2012-04-20T10:21:36.637 回答