SORU
30 HAZİRAN 2010, ÇARŞAMBA


Clojure: azaltmak vs Uygula

reduce apply kavramları arasındaki farkı anlıyorum:

(reduce   (list 1 2 3 4 5))
; translates to: (  (  (  (  1 2) 3) 4) 5)

(apply   (list 1 2 3 4 5))
; translates to: (  1 2 3 4 5)

Ancak, hangisi daha deyimsel clojure? Çok fark öyle ya da böyle yapar mı? (Sınırlı) performans testleri, reduce biraz daha hızlı gibi görünüyor.

CEVAP
30 HAZİRAN 2010, ÇARŞAMBA


reduce apply değişken parametre durumda tüm değişkenleri görmek için ihtiyacı olan ilişkisel fonksiyonlar için ders eşdeğer (nihai sonuç verdiğini açısından). Ne zaman onlar neden-bilge eşdeğer diyebilirim apply her zaman mükemmel deyimsel, reduce eşdeğer ve belki traş bir kısmını bir göz açıp kapayıncaya kadar geçiyor ... çok yaygın durumda. Aşağıda buna inanmak için benim mantığı.

değişken parametre dava için reduce açısından (2'den fazla bağımsız değişken) kendisi de uygulanır. Gerçekten de, bu gibi görünüyor bir derece mantıklı "varsayılan" yol gitmek için herhangi bir değişken parametre, ilişkisel işlevi: reduce olan potansiyelini gerçekleştirmek için bazı iyileştirmelere hızlandırmak için -- belki bir şey gibi internal-reduce 1.2 yenilik yakın zamanda devre dışı master, ama umarım olmak girmesini içinde gelecek olan olur saçma çoğaltmak her işlevi olabilir parası onlara dava sırasında. Bu ortak durumlar, apply sadece küçük bir yük ekleyecektir. (Bu konuda çok endişelenmeye gerek yok not.)

Öte yandan, karmaşık bir fonksiyon olabilir yararlanmak bazı optimizasyon fırsatları olan değil genel olacak kadar inşa halinde reduce; apply ki izin almak avantaj bu süre reduce olabilir aslında yavaş aşağı. İyi bir örnek, ikinci senaryo, çözümleri uygulama tarafından sağlanan str: kullanır StringBuilder dahili ve yararına önemli ölçüde kullanımı apply yerine reduce.

Yani, diyebilirim kullanın. apply ne zaman şüphe; ve biliyor musun bu değil satın almak bir şey üzerinde reduce (ve bu olası değişim çok yakında), çekinmeyin kullanın. reduce traş küçük gereksiz yük olduğunu düşünüyorsan.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Abbeydabby0277's channel

    Abbeydabby02

    9 ŞUBAT 2012
  • Apple

    Apple

    22 HAZİRAN 2005
  • Sergio Fernandez

    Sergio Ferna

    1 EKİM 2009