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. 斯卡拉並行集合類鑄
- 7. 瞭解斯卡拉集合執行
- 8. 斯卡拉集合一對一映射?
- 9. Typeclass和斯卡拉集合接口
- 10. 斯卡拉集合包含不使用==?
- 11. 斯卡拉XML自動瞬態時值爲null
- 12. 斯卡拉的斯卡拉斯類型推斷的狀態
- 13. 在斯卡拉轉置任意集合集合
- 14. 斯卡拉的空集:...不符合預期的類型集[Nothing]
- 15. 集團在斯卡拉
- 16. 斯卡拉垃圾收集?
- 17. Java <->斯卡拉收集轉換,斯卡拉2.10
- 18. 組合斯卡拉流
- 19. 斯卡拉:結合時間
- 20. 斯卡拉列表綜合
- 21. 斯卡拉功能組合
- 22. 斯卡拉:扁平化的混合集合的集合(或列表或數組)
- 23. 斯卡拉動態庫
- 24. 斯卡拉動態類型
- 25. 相交斯卡拉集與子集
- 26. 斯卡拉斯狀態單子例子
- 27. 可變的斯卡拉集合的不可修改的看法
- 28. 斯卡拉:_的
- 29. 斯卡拉在斯卡拉類
- 30. 的Java /斯卡拉(深)集合的互操作性
我知道那篇文章,你可以在評論中看到我:)但是這是永久性的矢量,不是暫時性的(我所問的)。事實上,我相信在撰寫本文時,Clojure中暫時還沒有出現。 – 2010-04-08 04:13:44