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ます。

元の質問については、レイジー seq の偶像的な使用法でなくても説明する価値があります。get-word-ids 関数は 1 つのエントリで遅延シーケンスを返すため、最初に使用する必要があります。そのエントリは、探している遅延シーケンスです。

このように見えます

( (word1 word2 word3) )

したがって、最初に必要なシーケンスを返します。

(word1 word2 word3)


lazy-seq使用するのは、次のパターン の場合のみである可能性が非常に高くなります。

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

他のパターンで lazy-seq が使用されているのを見たことがありません。の目的はlazy-seq、元のデータの新しいシーケンスを生成することです。データを生成するコードが存在する場合は、ほとんどの場合、 のようなものを使用するかiterate mapfor遅延シーケンスを生成する方が適切です。

于 2012-04-20T18:08:21.017 に答える
1

これは間違っているようです:

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

(index-words pos)はseqを返します。これが、get-word-idsに(最初の)が必要な理由です。

また、mapはすでに怠惰であるため、(map ...)をlazy-seqでラップする必要はありません。また、mapが怠惰でない場合、mapの周りにlazy-seqを使用することはほとんど無意味です。clojureの(怠惰な)シーケンスについてもう少し読んでおけば、おそらく便利でしょう。

于 2012-04-20T10:21:36.637 に答える