Как написать неизменяемый TallySet (считая мультимножество) в FSharp

Я пытаюсь создать неизменный тип коллекции, который ведет себя как гибрид мультимножества / пакета и карты, в которой записывается количество вхождений каждого элемента.

Я могу написать изменяемый код с кодом, подобным приведенному ниже, и я попытался написать неизменяемый, наследуя от 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

Что я должен написать?

1 ответ

Взгляните на ExtCore.Collections.Multiset. Как и в вашем коде, это просто карта с типом значения, установленным на count. Multiset.add а также Multiset.count соответствуют членам в вашем примере.

Другие вопросы по тегам