(defn unfold [step seed]
(if-let [[val new-seed] (step seed)]
(cons val (lazy-seq (unfold step new-seed)))
nil))
Przykład użycia:Czy Clojure ma "rozwinąć"?
(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)
Czy to lub coś podobnego istnieje w standardzie Clojure (lub powszechnie używany) bibliotekami? Jeśli nie, czy istnieje powód, dla którego? Najbliższy znalazłem jest to blogu:
http://www.matlux.net/blog/2014/05/04/anamorphic-adventure-in-clojure
Zapomniałem, co mnie zmotywowało do zadawania tego pytania, ale chciałem tylko lepiej zrozumieć, jak pisać idiomatyczne clojure dla takich zadań. Myślę, że twoja odpowiedź stanowi dobrą robotę dostarczenia informacji, których szukałem. –
groovy, dziękuję! –