2012-04-20 3 views
2

なぜget-word-idに "first"を使用する必要がありますか?これを行う正しい方法は何ですか?別のシーケンスに基づいて新しいシーケンスを返すClojure関数を作成する正しい方法は何ですか?

(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)) 
+0

あなたは 'lazy-seq'を間違って使用していますが、あなたが尊敬しなければならないイディオムがあります。しかし、主に、これは低レベルのものであり、 "正しい方法"は、あなたが望むものを達成するために、 'map'、' filter'、 'for'などの既存のコア関数を組み合わせることでしょう。 –

+0

[このSOの質問を見てください](http://stackoverflow.com/questions/4992298/clojure-lazy-sequence-usage) –

答えて

4

短い答え:lazy-seqへのすべての参照を削除します。

あなたのオリジナルの質問については、それがレイジーセクの空想的な使用ではないとしても説明する価値があります。 get-word-ids関数が1つのエントリでレイジーシーケンスを返すため、最初に使用する必要があります。そのエントリはあなたが探しているレイジーシーケンスです。

この

((word1 word2 word3)) 

はそう最初のあなたがしたい列を返すようになっています

(word1 word2 word3) 


あなたが lazy-seqを使用するだけの時間がこのパターンになります可能性が非常に高いです。

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

verはlazy-seqが他のパターンで使われています。 lazy-seqの目的は、元のデータの新しいシーケンスを生成することです。データを生成するコードが存在する場合は、遅いシーケンスを生成するために、ほとんどの場合iteratemapまたはforのようなものを使用する方がよいでしょう。

+0

ありがとう、アーサー。それでは、Javaメソッドがイテレータを返すので、iterator-seqがindex-wordsで正しく使用されていますか? – espeed

1

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

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

(インデックス・ワードのPOS)は、配列を返します。それであなたはget-word-idsで(最初の)必要があります。

もマップがすでに怠け者なので、怠惰な-seqの中で(マップを...)ラップする必要はありません、マップ怠け者でなかった場合はマップの周りに怠惰-seqのを使用することはほとんど無意味だろう。あなたがクローゼットの(怠惰な)シーケンスをもう少し読み上げれば、おそらく役に立ちます。

関連する問題