如何在FSharp中编写不可变的TallySet(计算多重集)

时间:2016-09-28 11:41:46

标签: f# override immutability sealed

我正在尝试创建一个行为混合的不可变集合类型 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

我应该写什么?