2016-09-28 3 views
2

マルチセット/バッグのハイブリッド と各項目の出現数を記録するMapとして動作する不変のコレクションタイプを作成しようとしています。FSharpで不変のTallySet(集計マルチセット)を書く方法

私は以下のようにコードを少し変更して書くことができます。マップから継承することで不変のコードを書き込もうとしましたが、マップは封印されています。

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は、例のメンバーに対応しています。

関連する問題