Özellikle Scala gibi işlevsel dilleri bildiğim halde, Clojure'da oldukça yeniyim.Clojure koleksiyonları üzerindeki işlemler
Clojure'daki koleksiyonlarda çalışmanın deyimsel yolunun ne olduğunu bulmaya çalışıyorum. Özellikle map
gibi işlevlerin davranışı ile kafam karıştı. , Clojure içinde, yerine
List(1, 2, 3) map (2 *) == List(2, 4, 6)
Set(1, 2, 3) map (2 *) == Set(2, 4, 6)
Vector(1, 2, 3) map (2 *) == Vector(2, 4, 6)
:
Scala olarak, büyük bir özen map
her zaman orijinal koleksiyon aynı tip bir koleksiyon döndürür, böylece yapımında alınır sürece bu mantıklıdır olarak Anladığım kadarıyla, map
veya filter
gibi çoğu işlem, hevesli veri yapılarında çağrıldığında bile, tembeldir. Bu,
'un bir vektör yerine tembel bir listenin yapılmasının garip bir sonucudur.
Genel olarak, tembel operasyonları tercih etsem de, yukarıdaki kafa karıştırıcıyı buluyorum. Aslında, vektörler listelenmeyen belirli performans özelliklerini garanti eder.
Yukarıdaki sonucu kullandığımı ve sonuna eklediğimi varsayalım. Doğru bir şekilde anladığımda, sonuca eklemedene kadar sonuç değerlendirilmez, o zaman değerlendirilir ve bir vektör yerine bir liste alırım; bu yüzden sonuna eklemek için onu geçmek zorundayım. Elbette bunu daha sonra bir vektöre dönüştürebilirim, fakat bu karmaşıklaşır ve gözden kaçabilir.
Eğer doğru anlıyorsam, map
polimorfiktir ve uygulamak bir sorun olmaz çünkü vektörler üzerinde bir vektör döndürür, listelerde bir liste, akışlarda bir akış (bu sefer tembel semantik ile) ve benzeri . Clojure'ın ve onun deyimlerinin temel tasarımı hakkında bir şey kaçırdığımı düşünüyorum.
Klojure veri yapıları üzerindeki temel işlemlerin yapının önüne geçmemesinin nedeni nedir?
Harita için kaynak koduna bakın. Harita, koleksiyonun türünü umursamıyor. Koleksiyonun türünü hatırlayan ve en sonunda koleksiyonun türüne dönüştürülen bir harita üzerinde bir makro oluşturabilirsiniz. https://github.com/clojure/clojure/blob/master/src/clj/clojure/core/reducers.clj –
https://github.com/ adresinde clojure.algo.generic.functor/fmap adresine bir göz atın. Girdi türünü koruyan bir 'map' uygulaması için clojure/algo.generic. – Alex