2013-10-20 16 views
9

Clojure: (def N (iterate inc 0))'da doğal sayıların tembel bir sıralamasını tanımlamak kolaydır. Şaşırtıcı olmayan bir şekilde, Clojure'a (apply min N)'u kullanarak en az N'yi bulmasını istersek, sonsuz bir gerileme içinde sıkışır.Clojure'ın 0'ın en küçük doğal sayı olduğunu anlamasına nasıl yardımcı olabilirim?

aslında "inşa" bir yolu var mı N veri yapısına (= 0 (min N)) o? , ve biz bunu biliyoruz, çünkü artış fonksiyonu inc kesinlikle artmaktadır. min işlevi, bu bilgiyi nasıl kullanacağını bilmez ve bunun yerine cevaba giden yolu zorlamak için çabalar.

programlı bu kodlamak için nasıl bilmiyorum. & bağıntıları gibi ek yapıya sahip tembel diziler oluşturmanın bir yolunu istiyorum. Optimizasyon problemlerini çözmek için bu kısıtlamalardan yararlanmanın bir yolunu da (dizinin asgari veya en azını bulmak gibi) istiyorum.

yerli Clojure bunu yapmanın bir yolu var mı? Datomic'dan ne haber?

+0

Datomic nereye sığar? Bu ekstra kısıtlamayı saklamaya mı çalışıyorsunuz? – Jared314

cevap

6

Sahip olduğunuz belirli örnek için meta verileri kullanabilirsiniz.

(defn my-range 
    ([] (my-range 0)) 
    ([n] (with-meta 
     (cons n (lazy-seq (my-range (inc n)))) 
     {:onlyincreases true}))) 

(defn my-min [x] (if (:onlyincreases (meta x)) (first x) (min x))) 

(my-min (my-range)) ;; => 0 
(my-min (next (my-range))) ;; => 1 
(my-min (nnext (my-range))) ;; => 2 

Daha genelleştirilmiş bir şeye ihtiyacınız varsa, kendi türünüzü oluşturmaya bakmak zorunda kalabilirsiniz.

İlgili konular