2016-09-28 38 views
2

我試圖創建一個不可變的集合類型,其行爲與multiset/bag和Map的混合編號 相同,它記錄了每個項目的出現次數。如何在FSharp中編寫不可變的TallySet(計數多重集)

我可以用下面的代碼編寫一個可變的代碼,我試圖通過從Map繼承來編寫一個不可變的代碼,但Map被封閉,不會讓我定義任何覆蓋。

type TallySet<'k_t when 'k_t : comparison>() = class 
    // inherit Map<'k_t, int> 
    let m_map:((Map<'k_t, int>) ref) = ref (Map.empty) 

    member x.add item = 
     m_map := 
      match (!m_map).TryFind item with 
       | None -> (!m_map).Add(item, 1) 
       | Some n -> (!m_map).Add(item, 1 + n) 
     !m_map 

    member x.Count with get() = Map.fold (fun cc k v -> cc + v) 0 !m_map 
end 

我該寫什麼?

+0

查看[F#中的地圖類型](https://github.com/fsharp/fsharp/blob/master/src/fsharp/FSharp.Core/map.fs)和[相應的簽名文件](https://github.com/fsharp/fsharp/blob/master/src/fsharp/FSharp.Core/map.fsi)將是一個好的開始。請注意,您日常使用的大部分功能都位於地圖模塊中,(略微向下滾動)。 – asibahi

回答

2

看一看ExtCore.Collections.Multiset。就像你的代碼一樣,它只是一個值類型設置爲count的映射。 Multiset.addMultiset.count對應於您示例中的成員。

相關問題