2

私は怠惰なリストをいじっていますが、これを理解できないようです。これを、必要なすべてを実行する 1 つの大きな再帰関数として記述することで問題を解決できると思いますが、より単純な関数で構成したいと考えています。

私の問題に簡単に変換できる簡単な例を書いてみます。

(defn numbers 
  ([] (numbers 1))
  ([n] (cons n (lazy-seq (numbers (inc n))))))

(defn repeat-n [n]
  (take n (repeat n)))

したがって、2 つの関数があります。1 つは数字の遅延シーケンスを返します。もう 1 つは、number パラメーターを n 回返します (これも怠惰であることを願っています。そうでない場合は、簡単に記述できるように思えます)。

結果の遅延シーケンスを返すような方法で、repeat-n を数値にマップしたいと思います。lazy-seqlazy-cat、 、および再帰関数を少しいじってみましconcatたが、まだ問題があります。

関数はこのようなものでなければなりません

(lazy-concat-map [f items] ...)

そして(うまくいけば)呼び出しの結果

(take 11 (lazy-concat-map repeat-n numbers)) 

だろう

12233344445

何か案は?

4

1 に答える 1

4
(take 11 (mapcat #(repeat % %) (range)))
;=> (1 2 2 3 3 3 4 4 4 4 5)

関数mapconcat(および組み合わせmapcat)、repeatおよびrangeはすべて遅延型です。

リスト内包for表記も怠け者

(take 11 (apply concat (for [x (range)] (repeat x x))))
;=> (1 2 2 3 3 3 4 4 4 4 5)
于 2013-05-29T15:37:12.337 に答える