如何在不指定构造函数的情况下从列表中提取可区分的联合类型?

Robur_131

假设我有一个由三个案例组成的受歧视联合。CaseACeach 需要一个构造函数来输入XY我有一个由不同 DU 类型组成的列表,我想将该列表过滤为单个 DU 类型。目前,我有一个列表,其中包含A,BC现在,如果我只想过滤 DU 列表以键入 case A,我该如何做到这一点而不必将构造函数传递给 case A(或传递默认构造函数,我也不知道该怎么做)

type X = {
    Id:   string
    Name: string
}

type Y = {
    Id: int
}

type DU =
| A of a:X
| B
| C of b:Y

let extractDUTypesFromList (listDU: List<DU>) (typ: DU) : List<DU> =
    listDU
    |> List.filter (fun m -> m = typ)

let a = (A {Id = "1"; Name = "Test"})
let aa = (A {Id = "2"; Name = "Test 2"})
let b = B
let c = (C {Id = 1})

let listDU: List<DU> = [a; b; c; aa]

let filteredDUList: List<DU> = // this list will only contain case A
    extractDUTypesFromList listDU (A _) // doesn't work
格斯

为了像这样过滤,我们需要与 DU 构造函数相反的函数,它是一个主动识别器。

不幸的是,您必须手动创建它们,虽然我建议让 F# 编译器自动派生它们,但这是一个很好的示例,说明了为什么此类建议很重要。

// Active recognizers (ideally autogenerated)
let (|A|_|) = function | A x -> Some x  | _ -> None
let (|B|_|) = function | B   -> Some () | _ -> None
let (|C|_|) = function | C x -> Some x  | _ -> None

let inline extractDUTypesFromList (listDU: List<DU>) (typ: DU -> Option<'t>) : List<DU> =
    listDU
    |> List.choose (fun x -> typ x |> Option.map (fun _ -> x))

let a = (A {Id = "1"; Name = "Test"})
let aa = (A {Id = "2"; Name = "Test 2"})
let b = B
let c = (C {Id = 1})

let listDU: List<DU> = [a; b; c; aa]

let filteredDUList: List<DU> = // this list will only contain case A
    extractDUTypesFromList listDU (|A|_|)

结果是

val filteredDUList : List<DU> = [A { Id = "1"
                                     Name = "Test" }; A { Id = "2"
                                                          Name = "Test 2" }]

无需说您可以创建普通函数而不是主动识别器,因为仅在这种用法中我们根本不使用模式匹配,我的意思是您可以tryA按照建议命名函数,而不是(|A|_|).

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在不指定类型的情况下修改函数输入参数?

如何在不区分文件的情况下制作 Python 包,即其他类型

如何在不超时的情况下从单元格值中提取 URL?

如何在函数的参数中不使用类型的情况下指定函数的类型?

如何在不事先知道类型的情况下动态构造Scala类?

如何在不指定值列表的情况下创建选择列表?

spring如何在不传递参数的情况下实例化@Autowired构造函数

如何在不丢失这些类型的情况下取消列出混合类型列表?

如何在不知道形式参数类型的情况下找到构造函数?

如何在不指定Java Enum类型的情况下引用我的Java Enum

如何在不指定模板类型的情况下声明通用抽象类的对象

如何在不指定组件类型的情况下将父组件注入共享指令?

如何在不指定类的情况下使用显式类型参数调用Java方法?

如何在不指定共享类型的情况下使用Box Java SDK创建共享链接?

如何在不循环的情况下从函数参数中指定的json数组中获取密钥?

如何在不指定模板的情况下声明函数模板指针typedef?

如何在不使用assert的情况下指定函数输入和输出的类型?

如何在不更改Metric类型的情况下使函数返回双精度?

如何在不指定final的情况下访问变量?

C如何在不损失性能的情况下从巨大的循环中提取预定义的巨大开关?

如何在不编译每个表达式的情况下从正则表达式中提取不同的变量

编译器如何在不更改参数列表的情况下重载模板函数?

在不验证属性的情况下测试联合变量的类型

如何在不丢失其类型的情况下将rxjava2 Zip函数(从Single / Observable)的可归纳性推广到n个Nullable参数?

如何在不丢失其类型的情况下将rxjava2 Zip函数(从Single / Observable)的可归纳性推广到n个Nullable参数?

如何在不破坏move和copy构造函数的情况下声明虚拟析构函数

在IntelliJ IDEA中,如何在不使用箭头键的情况下从智能建议列表中提取建议项目?

如何在不覆盖值的情况下映射列表

如何在不丢失元素的情况下遍历列表