2016-09-28 10 views
2

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

Я могу написать измененный код с немного похожим ниже, и я попытался написать неизменяемый, наследуя от Карты, но 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. Как и в вашем коде, это всего лишь карта с типом значения, установленным для счетчика. Multiset.add и Multiset.count соответствуют вашим членам в вашем примере.