Clojure有一個非常好的概念transient collections。有沒有提供Scala(或F#)的庫?斯卡拉的瞬態集合?
回答
我不知道這個在F#中的任何庫(標準庫中沒有任何內容,並且我不記得看到任何類似這樣的博客,雖然有許多用於簡單持久化/不可變結構的庫) 。對於某些第三方來說,創建這樣一個圖書館會很好。 Rich Hickey現在是這些真棒實用(主要)功能數據結構的人,我喜歡閱讀這些內容。
這聽起來像F#這樣的語言真的很棒,感謝一個有趣的鏈接!
使用數組編程時,F#程序員使用完全相同的模式。例如,創建一個可變數組,將其初始化,然後將其返回,然後使用將其視爲不可變的函數(如Array.map
(即使數組實際上可以被突變,因爲沒有瞬態數組))處理它。
使用了序列<「一>型:一種方式做同樣的事情是將數據結構轉換爲通用序列(seq<'a>
),這是一個不可變的數據類型,所以你不能(直接)修改原始數據結構通過seq<'a>
。例如:
let test() =
let arr = Array.create 10 0
for i in 0 .. (arr.Length - 1) do
arr.[i] <- // some calculation
Array.toSeq arr
的好處是,該轉化通常是O(1)(陣列/列表/ ..實施seq<'a>
作爲接口,所以這只是澆鑄)。但seq<'a>
不保留源集合的屬性(例如效率等),並且只能使用用於處理序列的通用函數(來自Seq
模塊)對其進行處理。不過,我覺得這個比較接近於的瞬態收藏模式。
類似的.NET類型也是ReadOnlyCollection<'a>
,它將集合類型(比seq<'a>
更強大)封裝到一個不可變包裝器中,該包裝器的操作用於修改集合拋出異常。對於更復雜的集合類型,F#/ .NET通常同時具有可變和不可變的實現(不可變的實現來自F#庫)。類型通常非常不同,但有時共享一個通用接口。這使得當你使用突變時可以使用一種類型,並在知道不再需要時將其轉換爲其他類型。但是,在這裏您需要在不同結構之間複製數據,所以轉換肯定不是O(1)。它可能是O(n)和O(n * log n)之間的東西。類似集合
實例爲具有不可變Map<'Key, 'Value>
和可變HashSet<'T>
或SortedSet<'T>
與不可變set<'T>
(從F#庫)可變Dictionary<'Key, 'Value>
。
請看看丹尼爾Spiewak以下職位:
http://www.codecommit.com/blog/scala/implementing-persistent-vectors-in-scala
他還移植了算法通過希基豐富的Scala。在文章中也提到了IntMap,它幾乎與Clojure實現一樣快。
- 1. 斯卡拉更新集合
- 2. 斯卡拉:過濾選項的集合
- 3. 瞭解斯卡拉集合執行
- 4. 斯卡拉:重寫集合類型
- 5. 斯卡拉集合循環緩衝區
- 6. 斯卡拉XML自動瞬態時值爲null
- 7. 斯卡拉的空集:...不符合預期的類型集[Nothing]
- 8. 集團在斯卡拉
- 9. 組合斯卡拉流
- 10. Java <->斯卡拉收集轉換,斯卡拉2.10
- 11. 斯卡拉:扁平化的混合集合的集合(或列表或數組)
- 12. 斯卡拉動態類型
- 13. 斯卡拉斯狀態單子例子
- 14. 斯卡拉在斯卡拉類
- 15. 的Java /斯卡拉(深)集合的互操作性
- 16. 斯卡拉過濾器的集合類型
- 17. 斯卡拉集合:是否有安全的地圖操作?
- 18. 斯卡拉2.8隱式的Java集合轉換
- 19. 斯卡拉方法參數:選項的集合或默認值
- 20. 返回類型和子類的Java集合斯卡拉從
- 21. 斯卡拉應用隱函數的集合
- 22. 適當的斯卡拉集合類似於Python字典
- 23. 斯卡拉可變集合的迭代器?
- 24. 斯卡拉的基本集合類型是什麼?
- 25. 斯卡拉樣的命令行拼合
- 26. 斯卡拉的靜態測試
- 27. 斯卡拉的動態混合 - 有可能嗎?
- 28. 卡夫卡與斯卡拉
- 29. 在斯卡拉
- 30. 在斯卡拉
我知道那篇文章,你可以在評論中看到我:)但是這是永久性的矢量,不是暫時性的(我所問的)。事實上,我相信在撰寫本文時,Clojure中暫時還沒有出現。 – 2010-04-08 04:13:44