如何在FSharp中编写不可变的TallySet(计数多重集)
问题描述:
我试图创建一个不可变的集合类型,其行为与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
我该写什么?
答
看一看ExtCore.Collections.Multiset。就像你的代码一样,它只是一个值类型设置为count的映射。 Multiset.add
和Multiset.count
对应于您示例中的成员。
查看[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