f# - 如何在 FSharp 中编写不可变的 TallySet(计数多重集)

标签 f# overriding immutability sealed

我正在尝试创建一个不可变的集合类型,其行为类似于混合 multiset/bag 和记录每个项目出现次数的 Map。

我可以用类似于下面的代码编写一个可变的,我尝试通过继承 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

我应该写什么?

最佳答案

看看ExtCore.Collections.Multiset 。正如您的代码中一样,它只是一个将值类型设置为计数的映射。 Multiset.addMultiset.count 对应于示例中的成员。

关于f# - 如何在 FSharp 中编写不可变的 TallySet(计数多重集),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39746452/

相关文章:

f# - F# 做自动内存吗?

f# - 确定列表的所有元素是否属于同一个 DU 案例

list - 如何计算n个不同类型列表的笛卡尔积?

f# - FParsec 解析无序子句

python - 有没有一种方法可以在不更改任何包含的可变类型的情况下更新字典?

javascript - 覆盖 craftyjs 中的函数

php - 如何从 Symfony2 中的包覆盖全局 Monolog 配置

c# - 用 Equals() 覆盖相等运算符

c# - 字符串不变性在向开发人员解释字符串引用时扮演什么角色?

c# - 在 C# 中编写不可变结构的最短方法