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

Esempio utilizzo:Il Clojure si è "aperto"?

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

Fa questo o qualcosa di simile esiste in versione standard clojure (o comunemente usati) librerie? Se no, c'è una ragione per cui? Il più vicino che ho trovato è questo post del blog:

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

risposta

4

No, unfold non è implementato in Clojure. È fornito da amalloys flatland.utile libreria, che ha un ampio utilizzo secondo CrossClj. Visto che il post sul blog che hai linkato fornisce una esplorazione molto approfondita dell'argomento, sospetto che ci sia di più nella tua domanda di quanto una risposta diretta possa soddisfare ... Hai in mente qualche scenario in cui lo iterate è inadeguato? O deluso dal fatto che iterate non sia del tutto unfold di nome o comportamento?

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

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

I preferiscono usare iterate per questi esempi perché iterate fa parte del nucleo già. Riesco a vedere persone che preferiscono unfold se questo è più familiare a loro.

Ci sono molte librerie che forniscono "cose ​​che avrebbero dovuto essere nel nucleo" come https://weavejester.github.io/medley/medley.core.html. Una ricerca rapida su https://crossclj.info/ rivela https://github.com/amalloy/useful contiene flatland.useful.seq/unfold, che sebbene non ho usato sembra essere una grande implementazione da parte di un contributore principale di Clojure e viene fornito con altre cose interessanti da avviare.

+0

Ho dimenticato cosa mi ha spinto a fare la domanda, ma volevo solo avere un'idea migliore di come scrivere un clojure idiomatico per tali compiti. Penso che la tua risposta faccia un buon lavoro fornendo il tipo di informazioni che stavo cercando. –

+0

groovy, grazie! –

Problemi correlati