f# - 在 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
解决方案
对于您指定的此类枚举类型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
推荐阅读
- upload - 为动态模块上传 Firebase Crashlytics 本机符号
- react-native - 无法在 FlatList 中呈现对象数组
- sql - 根据标签字段条件过滤查询以列出资源。多对多 SQL 关系表的过滤查询
- c++ - 是否允许 C++ 编译器将最后一次使用的左值隐式转换为右值?
- haskell - 在对象之外更改对象的变量是否被视为副作用?
- c++ - C++ -1 index has value of last index element ? Huh?
- android - 将数字字符串格式化为 2 个十进制双精度数,与数字字符串长度无关
- powershell - 如何使用 PowerShell 在行位置的文件中插入新行?
- javascript - D&D 翻页计数器
- javascript - 按选择元素的值过滤组件