2016-09-28 9 views
2

multiset/bag 및 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.addMultiset.count은 예제의 구성원에 해당합니다.