首页 > 解决方案 > 在 F# 中的可区分联合中按值匹配

问题描述

与这个联盟:

type T =
    | A
    | B
    | C

和一个T 列表

我想实现类似这样的伪代码:

let countOfType (t: Type) (l: T list) =
    l
    |> List.filter (fun x -> x.GetType() = t)
    |> List.length

如果我想计算“A”、“B”等,我会通过。但是 A.GetType() 和 B.GetType() 返回 T 类型,所以这不起作用。

有没有办法通过将类型作为参数传递来检查类型?

这里的实际情况是我有一个每隔几秒更新一次的地图,它的值是同一个 DU 的一部分。我需要能够查看每种类型的数量,而不必在每次添加条目时更新代码(如匹配块)。


附录:我把原来的问题简化了太多,看到Fyodor的回答后才意识到。

所以我想补充一点:对于这样的情况,如何才能做到这一点:

type T =
    | A of int
    | B of string
    | C of SomeOtherType

标签: f#

解决方案


对于您指定的此类枚举类型T,您可以使用常规比较:

let countOfType t (l: T list) =
    l
    |> List.filter (fun x -> x = t)
    |> List.length

用法:

> countOfType A [A; A; B; C; A]
3

> countOfType B [A; A; B; C; A]
1

推荐阅读