2016-09-28 29 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对应于您示例中的成员。

相关问题