回答

3

我不知道這個在F#中的任何庫(標準庫中沒有任何內容,並且我不記得看到任何類似這樣的博客,雖然有許多用於簡單持久化/不可變結構的庫) 。對於某些第三方來說,創建這樣一個圖書館會很好。 Rich Hickey現在是這些真棒實用(主要)功能數據結構的人,我喜歡閱讀這些內容。

4

這聽起來像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>

0

請看看丹尼爾Spiewak以下職位:
http://www.codecommit.com/blog/scala/implementing-persistent-vectors-in-scala

他還移植了算法通過希基豐富的Scala。在文章中也提到了IntMap,它幾乎與Clojure實現一樣快。

+0

我知道那篇文章,你可以在評論中看到我:)但是這是永久性的矢量,不是暫時性的(我所問的)。事實上,我相信在撰寫本文時,Clojure中暫時還沒有出現。 – 2010-04-08 04:13:44