F# 具有联合类型的筛选器列表

F# 具有联合类型的筛选器列表,f#,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 {

我是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

谢谢。

要做这类事情,通常的方法是创建一个helper函数,然后将其用作
列表的参数。filter

let isA u = match u with
    | A _ -> true
    | _ -> false

let resultOne = list |> List.filter isA
或者,您可以将helper函数内联,而不给它命名:

let resultOne = list |> List.filter (fun u -> match u with A _ -> true | _ -> false)
或者,如果你真的喜欢简洁,你可以使用
函数
语法(这是
fun x->match x with
)的糖:


好的,但我需要对判别并集中的每种情况使用一个helper函数。这不是很尴尬吗?为什么会尴尬?你需要做一个计算,你为它做一个函数。这就是编程通常的工作方式。它很麻烦,因为我需要一个函数来处理每种情况。如果我可以检查案例标识符,那就容易多了。但这似乎是不可能的。
let resultOne = list |> List.filter (function A _ -> true | _ -> false)