2015-12-16 11 views
5
(defn unfold [step seed] 
    (if-let [[val new-seed] (step seed)] 
    (cons val (lazy-seq (unfold step new-seed))) 
    nil)) 

使用例:それはClojureの標準(または一般的に使用される)LIBSに存在するようにClojureは「展開」していますか?

(defn fib-step [[x y]] [x [y (+ x y)]]) 
(take 10 (unfold fib-step [0 1])) ;=> (0 1 1 2 3 5 8 13 21 34) 

(defn decreasing [x] (if (neg? x) nil [x (dec x)])) 
(unfold decreasing 5) ;=> (5 4 3 2 1 0) 

がこのか何かをしていますか?そうでない場合は理由がありますか?私が見つけた最も近いが、このブログの記事です:

http://www.matlux.net/blog/2014/05/04/anamorphic-adventure-in-clojure

答えて

4

いいえ、unfoldはClojureの中に実装されていません。これは、CrossCljに従って広く使用されているamalloys flatland.usefulライブラリによって提供されています。あなたがリンクしているブログ投稿がかなりの深い探求をしているのを見て、直接答えが満足できるものよりもあなたの質問にもっと疑問がある...あなたはiterateが不十分であるいくつかのシナリオを持っていますか?またはiterateが名前または動作に全くunfoldではないことに失望しましたか?

(defn fib-step [[a b]] [b (+ a b)]) 
(take 10 (map first (iterate fib-step [0 1]))) 

(take-while (complement neg?) (iterate dec 5)) 

私はiterateはすでにコアの一部であるため、これらの例のためiterateを使用することを好みます。それがもっと馴染みがあるのであれば、私は人々がunfoldを好むのを見ることができます。

https://weavejester.github.io/medley/medley.core.htmlのような「コアであったはずのもの」を提供するライブラリがたくさんあります。 https://crossclj.info/のクイック検索では、https://github.com/amalloy/usefulにはflatland.useful.seq/unfoldが含まれていますが、これはClojureのコアコントリビュータによる優れた実装には使用されていませんが、ブートには他のクールなものが付属しています。

+0

私は質問をするために何が動機づけられたのか忘れてしまったが、私はちょうどそのような作業のために慣用句を書く方法のよりよい考えを得たかった。あなたの答えは、私が探していた情報の種類を提供する良い仕事をすると思います。 –

+0

グルービー、ありがとう! –

関連する問題