2015-12-16 21 views
5
(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

Odpowiedz

4

Nie, unfold nie jest realizowany w Clojure. Dostarcza go biblioteka amalloys flatland.useful, która ma szerokie zastosowanie zgodnie z CrossClj. Widząc, że blog, który łączysz, zapewnia dość głęboką eksplorację tematu, podejrzewam, że jest więcej na twoje pytanie, niż bezpośrednia odpowiedź może zaspokoić ... Czy masz jakiś scenariusz w umyśle, gdzie iterate jest niewystarczający? Lub rozczarowany, że iterate nie jest w nazwie lub zachowaniu w pewnym stopniu niezamierzony?

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

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

wolę używać iterate dla tych przykładów, ponieważ iterate jest częścią rdzenia już. Widzę ludzi, którzy wolą unfold, jeśli jest im to bardziej znane.

Istnieje wiele bibliotek, które zapewniają "rzeczy, które powinny być w rdzeniu", takie jak https://weavejester.github.io/medley/medley.core.html. Szybkie wyszukiwanie na https://crossclj.info/ ujawnia https://github.com/amalloy/useful zawiera flatland.useful.seq/unfold, który choć nie użyłem wygląda na świetną implementację przez rdzennego współtwórcę Clojure i jest wyposażony w inne fajne rzeczy do uruchomienia.

+0

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. –

+0

groovy, dziękuję! –