2016-09-28 7 views
2

J'essaie de créer un type de collection immuable qui se comporte comme un hybride de multiset/bag et Map qui enregistre le nombre d'occurrences de chaque élément.Comment écrire un TallySet immuable (multiset de comptage) dans FSharp

Je peux écrire un mutable avec du code un peu comme ci-dessous et j'ai essayé d'écrire un fichier immuable en héritant de Map mais Map est scellé et ne me laissera pas définir d'overrides.

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 

Que dois-je écrire?

+0

En regardant le code pour le [Type de carte en F #] (https://github.com/fsharp/fsharp/blob/master/src/fsharp/FSharp.Core/map.fs) et le [fichier de signature correspondant ] (https://github.com/fsharp/fsharp/blob/master/src/fsharp/FSharp.Core/map.fsi) serait un bon début. Notez que la plupart des fonctions que vous utiliseriez une utilisation au jour le jour sont dans le module de carte, (faites défiler légèrement vers le bas). – asibahi

Répondre

2

Jetez un oeil à ExtCore.Collections.Multiset. Comme dans votre code, c'est juste une carte avec le type de valeur défini sur le compte. Multiset.add et Multiset.count correspondent aux membres de votre exemple.