我正在尝试创建一个不可变的集合类型,其行为类似于混合 multiset/bag 和记录每个项目出现次数的 Map。
我可以用类似于下面的代码编写一个可变的,我尝试通过继承 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 。正如您的代码中一样,它只是一个将值类型设置为计数的映射。 Multiset.add
和 Multiset.count
对应于示例中的成员。
关于f# - 如何在 FSharp 中编写不可变的 TallySet(计数多重集),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39746452/