f# - 具有联合类型的过滤器列表
问题描述
我是 F# 和 fp 的新手。我尝试使用可区分的联合类型作为参数过滤列表。在我的示例中,我希望所有具有 A 型的人。我该如何解决这个问题,或者这是一个不好的方法?
type U =
| A of AA
| B of BB
| C
and AA = {
Id: string
}
and BB = {
Id: string
}
let list = [ A { Id = "0" }; B { Id = "1" }; C; A { Id = "2"}]
let filter (union: U) = list |> List.filter(fun x -> x = union)
let resultOne = filter A //Error
let resultTow = filter C //Ok
谢谢你。
解决方案
要做到这一点,通常的方法是创建一个辅助函数,然后将其用作参数List.filter
:
let isA u = match u with
| A _ -> true
| _ -> false
let resultOne = list |> List.filter isA
或者您可以将辅助函数内联,而不给它命名:
let resultOne = list |> List.filter (fun u -> match u with A _ -> true | _ -> false)
或者,如果你真的很简洁,你可以使用function
语法(它是 sugar for fun x -> match x with
):
let resultOne = list |> List.filter (function A _ -> true | _ -> false)
推荐阅读
- azure - 获取 azure powershell 上其标签以(或包含)特定字符串开头的所有资源 - Azure Powershell
- dart - 颤振 - Map 中的 Dart Map 调用为 null
- json - Comparing Json data. Python 3
- c - 为什么`pLQ->tail`是一个空指针?
- sql - 将多个日期行合并为单个并计数标准 SQL
- javascript - 通配符 * 响应所有请求的路由
- excel - VBA查找方法设置范围从字符串不准确
- c# - 如何使用不同的变量多次启动一个方法
- javascript - 围绕固定标记随机定位的圆圈
- javascript - 与相机碰撞时的 A-Frame Trigger javascript 函数